Spring Boot多模块项目开发
# Spring Boot多模块项目开发
# 一、Maven多模块架构概述
# 1.1 什么是父工程
父工程(Parent Project)是Maven多模块架构的核心组件,主要用于集中管理多个子模块的公共配置。父工程通过pom
类型的项目结构,为所有子模块提供统一的依赖版本控制、插件配置和构建流程,有效避免配置重复和版本冲突问题。
# 1.2 父子模块结构的优势
- 集中式依赖管理:通过
dependencyManagement
统一管理所有模块的依赖版本 - 配置继承机制:子模块自动继承父工程的大部分配置,减少重复声明
- 模块化开发:便于团队协作和代码复用,提高代码的可维护性
- 统一构建流程:确保所有模块使用一致的编译、测试和打包流程
# 二、典型的多模块项目结构设计
# 2.1 项目整体结构
netdisk-online/ # 父工程根目录
├── pom.xml # 父工程POM文件
├── netdisk-common/ # 通用工具模块
│ └── pom.xml
├── netdisk-model/ # 数据模型模块
│ └── pom.xml
├── netdisk-server/ # 核心业务服务模块
│ └── pom.xml
└── netdisk-dependences/ # 依赖管理模块
└── pom.xml
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2.2 各模块职责说明
- netdisk-common:提供各模块共用的工具类、常量定义、通用异常处理等
- netdisk-model:定义数据实体类、DTO对象、VO对象等数据模型
- netdisk-server:实现核心业务逻辑、控制器、服务接口等
- netdisk-dependences:管理项目依赖,可选的依赖管理模块
# 三、父工程创建详细步骤
# 3.1 定义父工程基础信息
创建父工程的POM文件,配置基础信息:
<!-- 定义项目模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 父模块的groupId、artifactId和version,作为子模块的统一标识前缀 -->
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 指定打包类型为pom,表明这是一个用于管理子模块的父工程 -->
<packaging>pom</packaging>
<!-- 项目基本信息描述 -->
<name>netdisk-online</name>
<description>网盘在线系统多模块父工程</description>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3.2 继承Spring Boot父工程
为了使用Spring Boot的依赖管理和插件功能,让父工程继承Spring Boot的父POM:
<!-- 继承Spring Boot的父工程,获取其依赖管理和插件配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- 使用稳定版本的Spring Boot,根据项目需要可以调整版本 -->
<version>2.7.17</version>
<!-- relativePath为空表示从仓库中获取parent -->
<relativePath/>
</parent>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3.3 声明子模块
使用modules
标签声明父工程管理的子模块:
<!-- 声明所有子模块,Maven会按照此顺序构建模块 -->
<modules>
<!-- 通用工具模块,包含各模块共用的工具类和通用功能 -->
<module>netdisk-common</module>
<!-- 数据模型模块,定义实体类、DTO、VO等 -->
<module>netdisk-model</module>
<!-- 核心业务服务模块,实现主要业务逻辑 -->
<module>netdisk-server</module>
<!-- 依赖管理模块,可选,用于管理第三方依赖 -->
<module>netdisk-dependences</module>
</modules>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 3.4 定义全局属性配置
使用properties
标签定义全局属性,供所有子模块使用:
<!-- 全局属性配置,定义所有子模块共享的配置信息 -->
<properties>
<!-- JDK版本配置 -->
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 项目编码配置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 跳过测试配置 -->
<skipTests>true</skipTests>
<!-- 各依赖库版本集中定义,方便统一管理和升级 -->
<logback.version>1.2.10</logback.version>
<mysql.version>8.0.23</mysql.version>
<mybatisplus.version>3.5.1</mybatisplus.version>
<aspectjweaver.version>1.9.4</aspectjweaver.version>
<okhttp3.version>3.2.0</okhttp3.version>
<fastjson.version>1.2.66</fastjson.version>
<commons.lang3.version>3.4</commons.lang3.version>
<commons.codec.version>1.9</commons.codec.version>
<commons.io.version>2.5</commons.io.version>
<hutool.version>5.8.5</hutool.version>
</properties>
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
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
# 3.5 统一依赖管理
使用dependencyManagement
标签统一管理依赖版本:
<!-- 依赖管理配置,统一控制依赖版本,子模块引用时无需指定版本 -->
<dependencyManagement>
<dependencies>
<!-- 持久层相关依赖 -->
<!-- MyBatis-Plus,提供强大的ORM和代码生成功能 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<!-- MySQL数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- AOP支持 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<!-- HTTP客户端 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp3.version}</version>
</dependency>
<!-- JSON处理 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 通用工具库 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons.codec.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<!-- 综合工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- 子模块依赖声明,便于模块间引用 -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netdisk-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netdisk-model</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
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
74
75
76
77
78
79
80
81
82
83
84
85
86
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
74
75
76
77
78
79
80
81
82
83
84
85
86
# 3.6 构建插件配置
配置通用的构建插件,供子模块继承使用:
<!-- 构建配置,定义所有子模块共享的构建插件 -->
<build>
<plugins>
<!-- Maven编译插件,统一编译配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 指定编译源代码使用的JDK版本 -->
<source>${java.version}</source>
<!-- 指定生成的类文件的目标JDK版本 -->
<target>${java.version}</target>
<!-- 指定编译时的编码 -->
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- 资源处理插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
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
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
# 四、子模块创建与配置详解
# 4.1 通用工具模块(netdisk-common)
通用模块用于存放所有模块共用的工具类、常量、异常处理等。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 声明父工程,继承父工程的配置 -->
<parent>
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子模块坐标,只需要artifactId,其他从父工程继承 -->
<artifactId>netdisk-common</artifactId>
<packaging>jar</packaging>
<name>netdisk-common</name>
<description>网盘系统通用工具模块</description>
<!-- 通用模块依赖配置 -->
<dependencies>
<!-- Spring Boot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 工具类库,无需指定版本,从父工程继承 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- JSON处理 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- 日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
</dependencies>
</project>
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
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
# 4.2 数据模型模块(netdisk-model)
数据模型模块用于定义实体类、DTO、VO等数据结构。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父工程 -->
<parent>
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块标识 -->
<artifactId>netdisk-model</artifactId>
<packaging>jar</packaging>
<name>netdisk-model</name>
<description>网盘系统数据模型模块</description>
<dependencies>
<!-- 依赖通用模块 -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netdisk-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- MyBatis-Plus,用于实体类注解和代码生成 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- Lombok,简化实体类开发 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
</project>
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
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
# 4.3 核心业务服务模块(netdisk-server)
业务服务模块是项目的核心,包含控制器、服务实现、配置等。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父工程 -->
<parent>
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块标识 -->
<artifactId>netdisk-server</artifactId>
<packaging>jar</packaging>
<name>netdisk-server</name>
<description>网盘系统服务端模块</description>
<dependencies>
<!-- 依赖数据模型模块 -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netdisk-model</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据库相关 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- AOP支持 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<!-- Spring Boot Maven插件,用于打包可执行jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 排除Lombok依赖 -->
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
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
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
# 4.4 依赖管理模块(netdisk-dependences)
依赖管理模块用于管理项目的外部依赖,是可选模块。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父工程 -->
<parent>
<groupId>org.scholar</groupId>
<artifactId>netdisk-online</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块标识 -->
<artifactId>netdisk-dependences</artifactId>
<packaging>pom</packaging>
<name>netdisk-dependences</name>
<description>网盘系统依赖管理模块</description>
<!-- 依赖管理模块通常不包含实际代码,仅用于管理依赖 -->
<dependencies>
<!-- 可以放置一些项目中不常用但可能需要的依赖 -->
</dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 五、模块间依赖关系管理
# 5.1 典型依赖关系
多模块项目中的依赖关系通常如下:
- netdisk-server → 依赖 → netdisk-model → 依赖 → netdisk-common
- netdisk-dependences 通常不被其他模块依赖
# 5.2 依赖传递原则
- 尽量避免循环依赖
- 遵循"最小知识原则",只依赖必要的模块
- 通过父工程统一管理版本,确保依赖一致性
# 六、构建与部署流程
# 6.1 构建命令
多模块项目常用构建命令:
# 清理并打包整个项目
mvn clean package
# 跳过测试打包
mvn clean package -DskipTests
# 只构建特定模块
mvn clean package -pl netdisk-server -am
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 6.2 部署策略
- 开发环境:可部署完整项目或单个服务模块
- 生产环境:通常只部署核心业务模块(netdisk-server)
编辑此页 (opens new window)
上次更新: 2025/03/17, 00:55:23