Spring Boot 多模块项目

2025年1月17日 | 阅读 11 分钟

多模块项目

包含嵌套 Maven 项目的 Spring Boot 项目称为多模块项目。在多模块项目中,父项目充当基础 Maven 配置的容器。

换句话说,多模块项目由一个父 POM 构建,该父 POM 管理一组子模块。或者,多模块项目由引用一个或多个子模块的父 POM 定义。

父 Maven 项目必须包含打包类型pom,这会将项目标识为聚合器。父项目的pom.xml 文件包含所有模块、公共依赖项和由子项目继承的属性列表。父 POM 位于项目的根目录。子模块是实际的 Spring Boot 项目,它们继承了父项目的 Maven 属性。

当我们运行多模块项目时,所有模块将一起部署在嵌入式 Tomcat 服务器中。我们也可以单独部署某个模块。

父 POM

父 POM 定义Group ID、Artifact ID、versionpackaging。在之前的 Maven 项目中,我们已经看到父 POM 定义的打包类型是jar。但在多模块项目中,父POM定义打包类型为pom。打包类型为 pom 的项目引用其他 Maven 项目。

为什么我们需要多模块项目

将项目拆分成多个模块有助于轻松维护。我们还可以轻松地编辑或删除项目中的模块,而不会影响其他模块。当我们需要单独部署模块时,这非常有用。

我们只需要在父 POM 中指定所有依赖项。所有其他模块共享相同的 POM,因此我们不需要在每个模块中单独指定相同的依赖项。这使得在一个大项目中更容易保持代码井井有条。

子模块-ear, war, 和 jar

子模块可以是任何项目,并且可以具有任何打包类型。我们可以自由地创建模块之间的任何类型的依赖关系并将它们捆绑在一起。

例如,我们创建一个EAR(企业归档)、WAR(Web 归档)和JAR(Java 归档)文件。JAR 文件被打包到 WAR 文件中,WAR 文件又被打包到 EAR 文件中。EAR 文件是最终准备好部署到应用程序服务器的包。

EAR 文件包含一个或多个 WAR 文件。每个 WAR 文件包含所有 WAR 文件通用的服务项目,其打包类型为 JAR。

Spring Boot Multi-Module Project

Maven 子项目/模块

  • 子模块是独立的 Maven 项目,它们共享父项目的属性。
  • 所有子项目都可以通过一个命令构建,因为它位于父项目内部。
  • 更容易定义项目之间的关系。

多模块项目目录结构

让我们来理解一下多模块项目的目录结构。

在下面的图像中,我们创建了一个名为spring-boot-multi-module-project的项目。它在目录底部包含父pom。之后,我们分别创建了两个Maven 模块,名为module1module2。这两个模块包含它们自己的 pom 文件。

Spring Boot Multi-Module Project

让我们打开父 POM,看看当我们创建 Maven 模块时,它配置了什么。

pom.xml

上面的 pom 文件与我们在前面示例中看到的相同。但在pom文件中,有两点值得注意:packagingmodules

当我们创建多模块项目时,我们需要在父 pom 文件中配置打包类型为 pom,而不是jar

当我们创建项目中的 Maven 模块时,Spring Boot 会自动在module标签内的父 POM 中配置模块,如下所示:

现在,我们将看看module1的 pom 文件里面有什么。

pom.xml

这里需要注意的一点是,上面的 pom 文件不包含像starter-web, web-mvc等通用依赖项。它继承了来自父 POM的所有通用依赖项和属性。

Spring Boot 多模块项目示例

让我们创建一个多模块应用程序的示例。

  • 在下面的示例中,我们创建了一个名为spring-boot-multimodule的 Maven 项目。这是主应用程序。在主应用程序中,我们创建了五个模块,如下所示:
  • 应用程序
  • model
  • repository
  • service-api
  • service-impl

Application Module

应用程序模块是项目的主模块。它包含应用程序类,其中定义了运行 Spring Boot 应用程序所必需的 main 方法。它还包含应用程序配置属性、Controller、视图资源

Application Module 依赖于 Model Module、Service Implementation Module,它们包含 Model Module、Repository Module 和 Service API 模块。

Model Module

Model Module 包含项目中使用的实体视觉对象

Repository Module

Repository 模块包含项目中使用的存储库。它依赖于 Model Module。

Service API Module

Service API 模块包含所有项目服务。它还依赖于 Model Module。

Service Implementation Module

Service Implementation 模块实现了服务。它依赖于 Repository Module 和 Service API Module。

POM Aggregator (Parent POM)

父 POM 包含所有应用程序模块。它还包含一个或多个模块所需的所有通用依赖项和属性。依赖项是无版本定义的,因为项目已将 Spring IO Platform 定义为父项。

让我们来理解一下我们创建的多模块应用程序的结构。

步骤 1:创建一个名为spring-boot-multimoduleMaven 项目

步骤 2:打开pom.xml(父 POM)文件,并将打包类型jar更改为pom

pom.xml (父 POM)

上面 pom 文件中需要注意的一点是,没有配置 Maven 模块,因为我们还没有创建它们。现在我们将逐一创建上面指定的 Maven 模块。

步骤 3:创建一个名为applicationMaven 模块

步骤 4:打开应用程序模块的pom.xml文件,确保打包类型为jar

pom.xml

步骤 5:创建main类。这是要运行的类。

SampleWebJspApplication.java

步骤 6:smaple.multimodule.web包下创建一个名为WelocameController的 Controller 类。

WelcomeController.java

步骤 7:src/main/resource -> templates ->welcome文件夹下创建一个名为show.htmlHTML文件。

show.html

步骤 8:打开application.properties文件,配置应用程序消息并将thymeleaf缓存设置为false

application.properties

创建完所有上述文件后,应用程序模块目录如下所示:

Spring Boot Multi-Module Project

让我们创建第二个模块,即model

步骤 9:创建一个名为modelMaven 模块

步骤 10:打开 model 模块的pom.xml文件,确保打包类型为jar

pom.xml

步骤 11:sample.multimodule.domain.entity包下创建一个名为Account的类。

Account.java

创建完所有上述文件后,model 模块目录如下所示:

Spring Boot Multi-Module Project

让我们创建第三个模块,即repository

步骤 12:创建一个名为repositoryMaven 模块

步骤 13:打开应用程序模块的pom.xml文件,确保打包类型为jar。(此处原文可能有误,应为 repository 模块的 pom.xml)

pom.xml

步骤 14:sample.multimodule.repository包下创建一个名为AccountRepository的类。

AccountRepository.java

创建完所有上述文件后,repository 模块目录如下所示:

Spring Boot Multi-Module Project

让我们创建第四个模块,即service-api

步骤 15:创建一个名为service-apiMaven 模块

步骤 16:打开service-api应用程序的pom.xml文件,确保打包类型为jar

pom.xml

步骤 17:创建一个名为sample.multimodule.service.api的包。

步骤 18:创建一个名为AccountNotFoundException的类。如果找不到账户,它会处理异常。

AccountNotFoundException.java

步骤 19:创建一个名为AccountService的类。它提供与账户相关的服务,例如查找创建账户。

AccountService.java

创建完所有上述文件后,service-api 模块目录如下所示:

Spring Boot Multi-Module Project

步骤 20:创建一个名为service-implMaven 模块

步骤 21:打开service-impl应用程序的pom.xml文件,确保打包类型为 jar。

pom.xml

步骤 22:sample.multimodule.service.impl包下创建一个名为AccountServiceImpl的类。

AccountServiceImpl.java

创建完所有上述文件后,service-impl模块目录如下所示:

Spring Boot Multi-Module Project

现在打开父 POM文件,我们会看到我们创建的所有 Maven 模块都配置在父 POM 的标签内。我们不需要手动配置它。

Spring Boot Multi-Module Project

现在确保所有五个模块都已创建,如下所示:

Spring Boot Multi-Module Project

创建完所有模块后,主项目目录如下所示:

Spring Boot Multi-Module Project

步骤 23:现在以 Java 应用程序的方式运行SampleWebJspApplication.java文件。

步骤 24:在浏览器中打开并调用 URL https://:8080。它将返回Message和账户号23

Spring Boot Multi-Module Project
下一主题Spring Boot 打包