如何用 Spring Boot 搭建一個父工程 (Parent Project),并在其中包含多個子模塊 (Module),適合企業級項目或者需要分模塊管理的場景。
Spring Boot 多模塊項目實戰:從零搭建父工程與子模塊
在日常開發中,我們經常會遇到這樣的需求:
系統功能復雜,代碼量龐大,需要拆分為多個模塊;
不同模塊之間既能獨立開發,又能在一個父工程下統一管理依賴;
項目結構清晰,方便團隊協作和后期維護。
這時,就需要用到 Spring Boot 多模塊工程 (Multi-Module Project)。
本文將從零開始,帶你一步步搭建一個 父工程 + 多個子模塊 的 Spring Boot 項目。
一、項目結構設計
我們先設想一個常見的企業級應用:
父工程 (parent-project)
common-module:通用工具類、公共依賴封裝
auth-module:權限認證模塊
user-module:用戶管理模塊
file-module:文件上傳與管理模塊
gateway-module:網關層
最終結構大概如下:
parent-project
│── pom.xml # 父工程配置,統一依賴版本
│
├── common-module
│ └── pom.xml
│
├── auth-module
│ └── pom.xml
│
├── user-module
│ └── pom.xml
│
├── file-module
│ └── pom.xml
│
└── gateway-module└── pom.xml
二、創建父工程
在 IDEA 中新建 Maven 項目,取名
parent-project
。GroupId:
com.example
ArtifactId:
parent-project
Packaging:
pom
(這里必須是pom
,表示這是父工程)
編輯
parent-project/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 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.7.18</version><relativePath/></parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version><packaging>pom</packaging><name>SpringBoot Multi Module Parent</name><description>Spring Boot 多模塊項目父工程</description><modules><module>common-module</module><module>auth-module</module><module>user-module</module><module>file-module</module><module>gateway-module</module><module>admin-module</module></modules><properties><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><spring-cloud.version>2021.0.8</spring-cloud.version><jwt.version>0.11.5</jwt.version><swagger.version>3.0.0</swagger.version><mysql.version>8.0.33</mysql.version><druid.version>1.2.18</druid.version><mybatis-plus.version>3.5.3.1</mybatis-plus.version><fastjson.version>2.0.32</fastjson.version><hutool.version>5.8.20</hutool.version></properties><dependencyManagement><dependencies><!-- Spring Cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 內部模塊依賴 --><dependency><groupId>com.example</groupId><artifactId>common-module</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>auth-module</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>user-module</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>file-module</artifactId><version>${project.version}</version></dependency><!-- JWT --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>${jwt.version}</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>${jwt.version}</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>${jwt.version}</version></dependency><!-- Swagger --><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>${swagger.version}</version></dependency><!-- MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- MyBatis Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- FastJSON --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- Hutool --><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.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>
三、創建子模塊
在 IDEA 中,右鍵 parent-project
→ New
→ Module
,選擇 Maven,然后逐個新建:
common-module
auth-module
user-module
file-module
gateway-module
注意:這些模塊的 pom.xml
中都要 繼承父工程。
1. common-module(公共模塊)
common-module/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version></parent><artifactId>common-module</artifactId><name>Common Module</name><description>通用模塊,包含工具類、異常處理、統一返回體等</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies>
</project>
2. auth-module(權限認證)
auth-module/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version></parent><artifactId>auth-module</artifactId><name>Auth Module</name><description>權限認證模塊,基于JWT和Spring Security</description><dependencies><dependency><groupId>com.example</groupId><artifactId>common-module</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
3. user-module(用戶模塊)
user-module/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version></parent><artifactId>user-module</artifactId><name>User Module</name><description>用戶管理模塊,支持Session和JWT兩種認證方式</description><dependencies><dependency><groupId>com.example</groupId><artifactId>common-module</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
4. file-module(文件上傳模塊)
file-module/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version></parent><artifactId>file-module</artifactId><name>File Module</name><description>文件管理模塊,支持文件上傳、下載、刪除等功能</description><dependencies><dependency><groupId>com.example</groupId><artifactId>common-module</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!-- 圖片處理 --><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.19</version></dependency><!-- 文件類型檢測 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.8.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
5. gateway-module(網關層)
gateway-module/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>springboot-multi-module-parent</artifactId><version>1.0.0</version></parent><artifactId>gateway-module</artifactId><name>Gateway Module</name><description>網關模塊,統一入口,處理跨域、日志、限流等</description><dependencies><!-- Spring Cloud Gateway (基于WebFlux,不能與spring-boot-starter-web一起使用) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Redis支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency><!-- macOS DNS解析器 (解決DNS解析警告) --><dependency><groupId>io.netty</groupId><artifactId>netty-resolver-dns-native-macos</artifactId><classifier>osx-x86_64</classifier><scope>runtime</scope></dependency><!-- JWT支持 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId></dependency><!-- 工具類 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><!-- 限流 --><dependency><groupId>com.github.vladimir-bukhtoyarov</groupId><artifactId>bucket4j-core</artifactId><version>7.6.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
四、運行與驗證
進入
parent-project
目錄,運行:
mvn clean install
啟動
web-api
模塊:
cd web-api
mvn spring-boot:run
打開瀏覽器訪問
http://localhost:8080
,驗證是否正常啟動。
五、總結
通過以上步驟,我們成功搭建了一個 Spring Boot 多模塊項目:
父工程統一管理依賴版本,保證一致性;
子模塊按功能拆分,職責清晰;
web-api
模塊作為入口,組合其他模塊的能力;后續可以方便地擴展更多模塊,如
order-module
、payment-module
等。
這種結構特別適合 中大型項目,能夠有效提升團隊協作效率和代碼可維護性。