843 字
约 2 分钟
5
S06-J01 · 多模块工程结构:parent / BOM / 聚合
适用读者:不知道依赖版本该写在哪一层的人。
前置:S06-B01、S01-J07。
实测环境:Maven 3.8.7 / JDK 17(2026-11-05)。
覆盖旧文:—(E 驱动)
覆盖扩展:E-S06-008(parent vs BOM vs 聚合)。
上一篇:S06-B05 · 第三方工具库:Guava / Hutool / StringUtils
下一篇:S06-J02 · 序列化陷阱。
1. 一句话结论
parent 管"继承",BOM 管"版本",聚合管"一起构建"。三件事经常被混在一个 pom.xml 里,但它们的职责完全不同。
| 机制 | 作用 | 关键标签 |
|---|---|---|
| parent | 子模块继承父的配置(插件、属性、依赖) | <parent> |
| dependencyManagement(BOM) | 只声明版本,不引入依赖 | <dependencyManagement> |
| 聚合(modules) | 一次构建多个模块 | <modules><module> |
2. 实测:子模块不写版本,版本来自 parent 的 BOM
父 pom.xml:
<properties><jackson.version>2.17.2</jackson.version></properties>
<dependencyManagement><dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies></dependencyManagement>
子模块:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <!-- 不写 version -->
</dependency>
结果:版本由 parent 统一决定;升级只改一处。
注意一个实测踩坑:mvn -pl app dependency:tree 会失败:
Could not resolve dependencies ... demo:core:jar:1.0.0 was not found
因为 -pl app 只构建 app,不会先构建它依赖的本地模块 → 需要 -am(B01 §2)或先 mvn install。
3. 三种结构的取舍
| 结构 | 适用 | 风险 |
|---|---|---|
| 单模块 | 小项目、库 | 无 |
| parent + modules(本系列默认) | 多模块应用 | 父 POM 变"上帝对象" |
| parent(继承)+ 独立 BOM 模块 | 多项目族共享版本 | 多一层引用,需维护 |
判据:"这个版本是"我们项目的"还是"整个组织共享的"?" 组织共享 → 单独 BOM 模块(platform-bom),其他项目 import 它。
4. 版本收敛的三条纪律
| 纪律 | 原因 |
|---|---|
所有版本集中在 dependencyManagement |
升级只改一处 |
子模块禁止写 <version>(除自身 artifact) |
写了就绕过 BOM |
外部 BOM 用 <scope>import</scope> |
Spring Boot 等官方 BOM 的正确用法 |
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.6</version><type>pom</type><scope>import</scope>
</dependency>
顺序规则:先声明的赢——内部 BOM 放在 Spring BOM 之前可覆盖其默认版本(S01-J07 §4.1)。
5. 五个误区
| 误区 | 真相 |
|---|---|
| "parent 就等于聚合" | 父子是继承关系,modules 是构建关系 |
| "BOM 会引入依赖" | 只声明版本 |
| "子模块写 version 更清楚" | 会绕过 BOM,版本失控 |
"-pl 会自动构建依赖模块" |
需 -am 或先 install |
| "一个 parent 管所有项目" | 项目族多了要拆 BOM |
6. 自检
- parent、BOM、聚合各管什么?
- 为什么子模块不该写
<version>? -pl失败提示core not found说明什么?两种修法?- 外部 BOM 怎么引入?
- 内部 BOM 与 Spring BOM 同时存在时,谁覆盖谁?
7. 下一篇
S06-J02 · 序列化陷阱:版本兼容、循环引用与反序列化安全
结构讲完,下一篇处理"数据在版本间流动"的问题:serialVersionUID 实测、以及反序列化为什么是 RCE 入口。
本篇属于系列《S06 · Java 工程化与组件》。扩展点 E-S06-008。BOM 与 -pl 行为为 2026-11-05 实测。
S06-J01 · 多模块工程结构:parent / BOM / 聚合
https://www.clxhxhhr.top/posts/5261/ S06-B06 · Java 生态四库实测:JJWT / sensitive-word / tianai-captcha / Commons Lang3
S06-J02 · 序列化陷阱:版本兼容、循环引用与反序列化安全
评论
0 条
还没有评论,先写一条吧。