前言
多Maven Module的项目结构,实践一下。
目标
基本上来说,我们希望构建的项目结构是这样的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40my-project
├── pom.xml
├── bom
│ ├── pom.xml
├── my-app
│ ├── src
│ │ └── main
│ │ ├── java
│ │ │ └── com.example.myapp
│ │ │ └── MyAppApplication.java
│ │ └── resources
│ │ └── application.properties
│ └── pom.xml
├── my-module1
│ ├── src
│ │ └── main
│ │ ├── java
│ │ │ └── com.example.module1
│ │ │ └── Module1Class1.java
│ │ └── resources
│ │ └── module1.properties
│ └── pom.xml
├── my-module2
│ ├── src
│ │ └── main
│ │ ├── java
│ │ │ └── com.example.module2
│ │ │ └── Module2Class1.java
│ │ └── resources
│ │ └── module2.properties
│ └── pom.xml
└── my-module3
├── src
│ └── main
│ ├── java
│ │ └── com.example.module3
│ │ └── Module3Class1.java
│ └── resources
│ └── module3.properties
└── pom.xml
其中,MyAppApplication.java
是程序入口,bom下存放的是BOM(Bill of Materials)。
BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。
BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有
<dependencyManagement>
这一个部分。只需要在<dependencyManagement>
定义对外发布的客户端版本即可。
在这种项目结构中,主项目(my-project)作为父模块,包含了所有子模块(my-app、my-module1、my-module2、my-module3…)。每个子模块都有自己的源代码目录(src/main/java)和资源目录(src/main/resources),并且每个子模块都有自己的 pom.xml 文件来定义其依赖和配置。
下面我们开始逐步构建项目。
1. 构建初始项目结构
新建Maven父项目,并在根目录下新建三个Maven Module,分别为bom、myapp、myappmodule1
。
2. 编写BOM
定义BOM如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54<!-- author: SilenceZheng66 -->
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.silencezheng</groupId>
<artifactId>bom</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<name>Archetype - bom</name>
<description>基础 bom 文件,管理整个项目的依赖版本</description>
<url>http://maven.apache.org</url>
<properties>
<revision>1.0.0-snapshot</revision>
<spring.boot.version>2.7.6</spring.boot.version>
<mysql-connector-j.version>8.0.33</mysql-connector-j.version>
<lombok.version>1.18.26</lombok.version>
<mybatis-plus-boot-starter.version>3.5.3.1</mybatis-plus-boot-starter.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-connector-j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3. 编写父项目POM
引入BOM。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73<!-- author: SilenceZheng66 -->
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.silencezheng</groupId>
<artifactId>multi-maven-module</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<name>Archetype - multi-maven-module</name>
<description>多模块Maven项目</description>
<url>http://maven.apache.org</url>
<modules>
<module>bom</module>
<!-- Server 主项目 -->
<module>myapp</module>
<!-- 各种 module 拓展 -->
<module>myappmodule1</module>
</modules>
<properties>
<revision>1.0.0-snapshot</revision>
<!-- Maven 相关 -->
<java.version>8</java.version>
<!-- 这里选8是因为Maven兼容性问题,本来要上17但是还需要换Maven -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.silencezheng</groupId>
<artifactId>bom</artifactId>
<version>${revision}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 对多模块项目结构似乎是必须的 -->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<!-- 注意编码很重要,否则可能导致MojoExecutionException -->
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- 使用 aliyun 的 Maven 源,提升下载速度 -->
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
</project>
4. 编写程序入口POM
这里不需要再指定java版本和包版本了。如果需要使用不同于当前bom中所维护的jar包版本,则加上<version>
覆盖即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61<!-- author: SilenceZheng66 -->
<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.silencezheng</groupId>
<artifactId>multi-maven-module</artifactId>
<version>${revision}</version>
</parent>
<groupId>com.silencezheng</groupId>
<artifactId>myapp</artifactId>
<name>myapp</name>
<description>myapp</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<!-- 设置构建的 jar 包名 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.6</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 -->
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 将引入的 jar 打入其中 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
5. 编写模块POM
提供一个示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<!-- author: SilenceZheng66 -->
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.silencezheng</groupId>
<artifactId>multi-maven-module</artifactId>
<version>${revision}</version>
</parent>
<packaging>jar</packaging>
<artifactId>myappmodule1</artifactId>
<name>myappmodule1</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
6. 打包
随便找个表用MyBatisX生成代码,然后运行通过后就可以打包了:mvn clean package -Dmaven.test.skip=true
。
后记
首发于 silencezheng.top,转载请注明出处。