maven的聚合构建(aggregation)通过父pom中标签统一管理子模块,要求父pom打包类型为pom、无业务代码,子模块以gav坐标依赖、由统一版本,构建命令须在父目录执行。

Maven 本身没有“复合构建”(Composite Build)这个概念——那是 Gradle 的术语。Maven 对应的机制叫聚合构建(Aggregation),通过 pom.xml 中的 <modules></modules> 声明实现,用于统一构建多个子模块。它不涉及跨仓库或独立构建的组合逻辑,纯粹是父子 POM 的层级管理。
聚合项目的结构必须符合约定
Maven 聚合要求项目有明确的父 POM,且所有子模块必须是其直接子目录(或通过相对路径可定位)。父 POM 的打包类型必须为 pom,且不能包含业务代码或源码目录(src/main/java 应为空)。
- 父项目根目录下必须有
pom.xml,其中声明:<packaging>pom</packaging>和<modules><module>api</module><module>service</module></modules> - 子模块名(如
api)必须与实际文件夹名完全一致(大小写敏感),不能带斜杠或后缀 - 每个子模块内部也必须有独立的
pom.xml,且<parent></parent>指向父项目的坐标(groupId、artifactId、version)
依赖和版本统一靠父 POM 的 dependencyManagement
父 POM 不直接声明运行时依赖,而是用 <dependencymanagement></dependencymanagement> 统一约束版本。子模块在自己的 pom.xml 中只写 <groupid></groupid> 和 <artifactid></artifactid>,无需指定 <version></version>,避免重复和冲突。
- 例如,父 POM 中定义 Spring Boot 版本:
<properties><spring-boot.version>3.3.0</spring-boot.version></properties>
再在<dependencymanagement></dependencymanagement>中引入spring-boot-dependenciesBOM - 子模块只需写:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid></dependency>
跨模块依赖要写对坐标,不是路径
Maven 中模块间依赖不是靠文件系统路径,而是靠 GAV 坐标(groupId:artifactId:version)。只要子模块在父 POM 的 <modules></modules> 中被声明,且已执行过 mvn install(或使用 reactor 构建),其他子模块就能直接依赖它。
- 比如
service模块要用api模块,就在service/pom.xml中写:<dependency><groupid>com.example</groupid><artifactid>api</artifactid><version>1.0.0-SNAPSHOT</version></dependency> - 注意:
version必须与api/pom.xml中声明的一致;若父 POM 管理了该 version,此处可省略 - 不要写成
<scope>system</scope>或硬编码本地路径——这会破坏可移植性
构建命令要在父目录执行
所有聚合操作必须在父项目根目录下运行 Maven 命令,否则 Maven 无法识别模块关系。
-
mvn clean compile:编译全部模块(按依赖顺序自动排序) -
mvn test:运行所有模块的测试 -
mvn package:打包所有模块(JAR/WAR) -
mvn deploy:将所有模块发布到远程仓库(需配置<distributionsmanagement></distributionsmanagement>) - 跳过某个子模块?用
-pl(project list)和-rf(resume from)控制范围,例如:mvn package -pl service -am表示只构建service及其依赖的模块
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











