Spring Boot 父工程创建教程
# Spring Boot 父工程创建教程
# 一、什么是父工程?
父工程(Parent Project)是 Maven 项目结构中的核心,主要作用是为多个子模块提供公共的依赖、插件配置、版本管理等。通过定义一个父工程,可以方便管理多个子项目,使它们共享配置,而无需重复编写这些内容。父工程通常是 pom
类型,不会编译为具体的应用或库,仅用来提供配置管理。
# 二、父工程结构概述
一个典型的父工程 pom.xml
文件主要包含以下几个部分:
- 基础的 Maven 配置:包括
groupId
,artifactId
,version
,以及项目的类型(通常为pom
)。 - 依赖管理:使用
dependencyManagement
统一管理子模块的依赖版本。 - 模块声明:通过
modules
节点声明子模块。 - 通用插件配置:子模块可以继承父模块中定义的插件配置。
# 三、创建父工程的步骤
# 1. 定义项目基础信息
在 pom.xml
文件中,首先定义项目的基础信息,包括 groupId
(项目组 ID),artifactId
(项目名称),version
(项目版本)。同时,定义项目的打包类型为 pom
,表示这是一个父项目而不是一个可执行的项目。
<!-- 定义项目模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 父模块的groupId和artifactId,统一管理子模块的配置 -->
<groupId>org.scholar</groupId>
<artifactId>netdisk-oline</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父工程定义为pom类型,子模块继承此父工程 -->
<packaging>pom</packaging>
2
3
4
5
6
7
8
9
10
- groupId:组织或公司标识。
- artifactId:项目名称。
- version:项目版本,使用
SNAPSHOT
表示开发中的版本。 - packaging:
pom
表示该项目为父工程。
# 2. 继承 Spring Boot 父工程
为了使用 Spring Boot 提供的基础依赖管理和插件,我们将父工程继承自 Spring Boot 的 spring-boot-starter-parent
。
<!-- 父工程继承 Spring Boot 的依赖管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/>
</parent>
2
3
4
5
6
7
此部分作用是使用 Spring Boot 的统一依赖版本管理和插件配置,简化子模块的配置。
# 3. 声明子模块
使用 <modules>
标签声明该父工程管理的子模块。每个子模块会有一个独立的目录和自己的 pom.xml
文件。
<!-- 模块声明 -->
<modules>
<module>netdisk-common</module>
<module>netdisk-model</module>
<module>netdisk-server</module>
<module>netdisk-dependences</module>
</modules>
2
3
4
5
6
7
子模块的 pom.xml
中需要通过 <parent>
标签引用父工程。
# 4. 定义通用配置属性
在父工程中定义一些子模块可能共用的属性,如 java
版本、编译编码格式等。这些属性会自动被所有子模块继承。
<!-- 通用配置属性,用于定义所有子模块的公共属性 -->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<skipTests>true</skipTests>
</properties>
2
3
4
5
6
7
8
- java.version:定义 Java 版本。
- project.build.sourceEncoding:设置项目编码格式为 UTF-8。
- maven.compiler.source/target:指定编译和目标的 Java 版本。
# 5. 统一依赖管理
通过 dependencyManagement
标签统一管理依赖版本,子模块无需再显式指定这些依赖的版本号。
<dependencyManagement>
<dependencies>
<!-- MyBatis-Plus Starter,MyBatis的增强工具 -->
<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>
<!-- Logback日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 其他依赖... -->
</dependencies>
</dependencyManagement>
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
通过这样配置,子模块在声明这些依赖时,只需要引用 groupId
和 artifactId
,而不必重复声明 version
,大大简化了配置管理。
# 6. 插件管理
父工程可以定义一些通用的插件配置,供子模块继承。以下示例中定义了 maven-compiler-plugin
来统一 Java 版本和编码。
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 7. 完整 pom.xml
<?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>
<!-- 父模块的groupId和artifactId,统一管理子模块的配置 -->
<groupId>org.scholar</groupId>
<artifactId>netdisk-oline</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父工程定义为pom类型,子模块继承此父工程 -->
<packaging>pom</packaging>
<!-- 父工程继承 Spring Boot 的依赖管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/>
</parent>
<!-- 模块声明 -->
<modules>
<module>netdisk-common</module>
<module>netdisk-model</module>
<module>netdisk-server</module>
<module>netdisk-dependences</module>
</modules>
<!-- 通用配置属性,用于定义所有子模块的公共属性 -->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<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>
<!-- 统一依赖管理,子模块可以自动继承这些依赖 -->
<dependencyManagement>
<!-- 这里只需要指定非Spring Boot Starter相关的依赖 -->
<!--父工程也就是继承的Spring Boot Starter,子模块间接继承即可-->
<dependencies>
<!-- MyBatis-Plus Starter,MyBatis的增强工具,简化持久层开发 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<!-- MySQL连接器,提供与MySQL数据库的连接支持 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Logback日志框架,提供日志记录功能 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- AspectJ Weaving,支持AOP功能的框架 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<!-- OkHttp,用于执行HTTP请求的高效工具 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp3.version}</version>
</dependency>
<!-- FastJSON,阿里巴巴提供的JSON处理库,支持高效的JSON序列化与反序列化 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Apache Commons Lang3,提供基本的工具类库,例如字符串操作等 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>
<!-- Apache Commons Codec,提供各种编码、解码的功能 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons.codec.version}</version>
</dependency>
<!-- Apache Commons IO,提供文件操作的辅助工具 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<!-- Hutool,Java的工具包,提供了丰富的工具类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 定义编译插件,子模块可以继承 -->
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 四、总结
通过创建父工程并定义通用配置,多个子模块可以继承这些配置,减少重复代码并保证一致性。在实际开发中,父工程提供了项目管理、依赖管理、插件管理的统一平台,有效提高了项目的维护性和扩展性。
通过这种方式,开发者可以方便地管理项目中的多个子模块,并共享父工程中的配置和依赖,从而简化开发过程。