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. 自检

  1. parent、BOM、聚合各管什么?
  2. 为什么子模块不该写 <version>?
  3. -pl 失败提示 core not found 说明什么?两种修法?
  4. 外部 BOM 怎么引入?
  5. 内部 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/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。