前言
多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,转载请注明出处。
 
		 
                      