项目采用的是Maven
多模块架构,项目的部分子模块的pom.xml
中重复引用了相同的JAR
包。很明显,当初在配置Maven
模块的时候,没有考虑清楚各个模块的架构职责,同时也不了解Maven
模块依赖的传递性。主要介绍一下Maven
多模块的配置思路和多模块的配置实操。
在实操之前,我们先要了解配置概览,配置大致可分为三大步:确定项目需要哪几个模块,项目中的每个模块的依赖关系如何,最后根据依赖关系配置。
第一步:确定项目的模块划分
模块的划分没有任何强制要求,一般的划分思路如下:
test
集成测试模块:该模块除了测试用例代码外,没有实际业务逻辑。facade
对外服务接口模块(如果有的话,一般业务类项目较小,服务类较大):主要是对外提供服务接口、请求参数和返回结果等JAR
包,其他项目需要依赖项目JAR
包,因此需要单独一个模块client
集成外部服务接口模块:和facade
对应,如果依赖了外部服务的话lang
基础公用模块:各个模块都会依赖的公共类模块,比如常用工具类、通用枚举等das
数据访问模块:接入DB
层的代码,包括DO/DAO
等service
领域核心服务模块:各个业务领域的核心服务逻辑web/biz
业务模块:业务逻辑模块。如果业务比较复杂,可进一步拆分,如web-user/web-order
等
根据上面说明,模块划分如下:
ntopic-test
集成测试模块ntopic
业务逻辑模块,包括SpringBoot
启动类、Web
模块、业务模块等ntopic-servcie
领域核心服务ntopic-client
外部服务器集成ntopic-das
DB
操作ntopic-lang
公共模块
第二步:确定各个模块的依赖关系
Maven
模块的依赖具备传递性,即:若模块A
依赖了模块B
,模块B
依赖了模块C
,则模块A
自动依赖了模块C
(有点类似于数学中数值大小的传递性,A>B
且B>C
,则A>C
)。
项目的各个模块依赖关系说明:
ntopic-test
集成测试模块:因为集成测试包括了所有的代码逻辑,所以它处于最上层ntopic
业务模块,业务逻辑依赖service
模块提供核心服务ntopic-service
核心服务模块,它依赖DB
数据读写和引入外部服务ntopic-lang
公共逻辑模块,它进一步依赖其他统一模块,如commons
模块等
第三步:Maven
多模块实操
多模块的核心在pom.xml
文件中,任何一个pom.xml
模块,都需要指定五个核心配置元素:
groupId
代表大分组,一般都是公司的域名,如com.aliaba
等artifactId
代表具体的JAR
包名,如sequence-jdbc / fastjson
等version
代表JAR
包版本,如 1.0.1 / 1.2.76 等packaging
代表模块打包方式,默认都是jar
,对于多模块的总模块或者父模块为pom
name
代表模块名称,可选配置,建议配置
总pom.xml
文件
总pom.xml
配置了整个项目的所有信息,包括项目的模块列表、依赖的JAR
包、仓库和打包方式等。
- 指定父模块:可选的,可以没有父模块。如
ntopic-boot
是基于SpringBoot
框架,所以它的父模块是SpringBoot
的。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<groupId>ntopic</groupId>
<artifactId>ntopic-parent</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>
<name>ntopic-parent</name>
- 指定模块本项目的模块列表:
<modules>
<module>ntopic-test</module>
<module>ntopic</module>
<module>ntopic-service</module>
<module>ntopic-das</module>
<module>ntopic-client</module>
<module>ntopic-lang</module>
</modules>
- 模块依赖管理,各个子模块中,可以直接使用这里配置的依赖:
<dependencyManagement>
<dependencies>
<!-- NTopic Modules -->
<dependency>
<groupId>ntopic</groupId>
<artifactId>ntopic-lang</artifactId>
<version>${ntopic.version}</version>
</dependency>
<dependency>
<groupId>ntopic</groupId>
<artifactId>ntopic-client</artifactId>
<version>${ntopic.version}</version>
</dependency>
<!-- 其他本项目子模块忽略 -->
<!-- SpringBoot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${springboot.boot.version}</version>
</dependency>
<!-- Google Guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
<!-- 其他省略 -->
</dependencies>
</dependencyManagement>
- 额外的
Maven
仓库和打包方式配置:
<repositories>
<repository>
<id>Gitee-obullxl</id>
<url>https://gitee.com/obullxl/maven-repository/raw/sequence-jdbc</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.boot.version}</version>
</plugin>
</plugins>
</build>
子模块pom.xml
文件
总模块配置好了之后,子模块的配置就简单多了,只需要配置3个信息块:父模块、四元素和依赖其它子模块。其中依赖的子模块按照第二步中的依赖关系配置即可:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ntopic</groupId>
<artifactId>ntopic-parent</artifactId>
<version>1.0.1</version>
</parent>
<artifactId>ntopic-service</artifactId>
<packaging>jar</packaging>
<version>${ntopic.version}</version>
<name>ntopic-service</name>
<dependencies>
<!-- NTopic Module -->
<dependency>
<groupId>ntopic</groupId>
<artifactId>ntopic-das</artifactId>
</dependency>
<dependency>
<groupId>ntopic</groupId>
<artifactId>ntopic-client</artifactId>
</dependency>
</dependencies>
</project>
编译项目各个模块
经过上面的配置,项目Maven
多模块架构已经配置完成,进行项目编译即可:
mvn compile
编译成功的结果:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ntopic-parent ...................................... SUCCESS [ 0.022 s]
[INFO] ntopic-lang ........................................ SUCCESS [ 0.873 s]
[INFO] ntopic-das ......................................... SUCCESS [ 0.121 s]
[INFO] ntopic-client ...................................... SUCCESS [ 0.042 s]
[INFO] ntopic-service ..................................... SUCCESS [ 0.055 s]
[INFO] ntopic ............................................. SUCCESS [ 0.073 s]
[INFO] ntopic-test ........................................ SUCCESS [ 0.114 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.094 s
[INFO] Finished at: 2023-12-15T19:44:56+09:00
[INFO] Final Memory: 35M/448M
[INFO] ------------------------------------------------------------------------