Java多模块Maven项目依赖继承与聚合协同:父模块设packaging=pom统一配置,子模块继承并省略版本号,聚合模块通过modules列表一键构建,推荐根POM同时承担双重角色。

Java 中用 Maven 构建多模块企业级项目,核心是靠 继承(Inheritance) 和 聚合(Aggregation) 两个机制协同工作:前者统一配置、消除重复;后者一键构建、集中调度。二者通常共存于同一父 POM,但职责分明——不是“一个东西”,也不能互相替代。
父模块必须是 pom 类型,且只做协调不写业务
企业级结构的第一步,是创建一个纯配置型的根父模块(如 mycompany-parent),其 pom.xml 中:
-
packaging 必须设为
pom,否则无法被继承或聚合 - 不放
src/main/java,也不写任何业务代码 - 定义统一的
<properties>(如 Java 版本、编码、依赖版本号) - 用
<dependencyManagement>声明所有公共依赖及其版本(如 Spring Boot、MySQL 驱动、Lombok),子模块引用时无需写<version> - 用
<pluginManagement>统一编译插件、打包插件、测试插件等配置
子模块按职责分层,通过 parent 显式继承父配置
典型企业分层结构包括:mycompany-common(工具类/通用实体)、mycompany-dao(数据访问)、mycompany-service(业务逻辑)、mycompany-web(REST 接口)。每个子模块的 pom.xml 中必须包含:
-
<parent>标签,明确指向根父模块的groupId、artifactId、version -
<relativePath>指定父 POM 路径(默认../pom.xml,若非父子目录则需调整,如../mycompany-parent/pom.xml) - 在
<dependencies>中直接引用父模块已管理的依赖,省略版本号(例:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>) - 可覆盖父模块中某项配置(如某个子模块需单独升级 Logback 版本),只需在自身
pom.xml中显式声明即可
聚合模块负责统一执行生命周期操作
聚合不一定等于父模块——它可以是独立的空模块(如 mycompany-aggregate),也可以与父模块合并为同一个 pom.xml。关键在于其 pom.xml 中的 <modules> 块:
立即学习“Java免费学习笔记(深入)”;
- 列出所有需参与统一构建的子模块路径(支持相对路径,如
<module>mycompany-dao</module>或<module>../mycompany-service</module>) - 执行
mvn clean install在聚合模块目录下,Maven 会自动按依赖顺序依次构建全部子模块 - 聚合不传递依赖,也不影响子模块间关系——它只是“触发器”和“编排器”
- 推荐将聚合模块与父模块合二为一(即根 POM 同时承担 inheritance + aggregation 双重角色),结构更简洁、维护成本更低
实际目录结构示例(扁平化布局更易协作)
企业项目常采用扁平目录(所有模块同级),便于 Git 分支管理和 CI/CD 配置:
mycompany-project/
├── pom.xml <-- 根POM:packaging=pom,含dependencyManagement + modules
├── mycompany-common/
│ └── pom.xml <-- 继承根POM,无version(由parent提供)
├── mycompany-dao/
│ └── pom.xml
├── mycompany-service/
│ └── pom.xml
└── mycompany-web/
└── pom.xml
此时根 pom.xml 的 <modules> 写法为:
<modules> <module>mycompany-common</module> <module>mycompany-dao</module> <module>mycompany-service</module> <module>mycompany-web</module> </modules>
不复杂但容易忽略


















