核心是用好+属性变量+继承机制:父pom在中集中声明依赖版本并用定义变量,子模块只写groupid和artifactid、禁用version,配合bom导入和enforcer插件自动校验。

在多模块 Maven 项目中统一控制依赖版本,核心是用好 <dependencymanagement></dependencymanagement> + 属性变量 + 继承机制,而不是靠子模块各自写 <version></version>。这样改一处就全局生效,避免遗漏、冲突和维护成本。
父 POM 中集中声明依赖版本
所有共用依赖(如 Spring Boot、Jackson、Logback、Lombok 等)必须在父工程的 <dependencymanagement></dependencymanagement> 块中声明版本,且只声明、不引入——它只是“承诺”,不是“安装”。
- 在父 POM 的
<properties></properties>中定义版本变量:<spring-boot.version>3.3.3</spring-boot.version><logback.version>1.4.14</logback.version> - 在
<dependencymanagement><dependencies></dependencies></dependencymanagement>中引用这些变量:<groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid><version>${spring-boot.version}</version> - 子模块的
<dependencies></dependencies>里只写<groupid></groupid>和<artifactid></artifactid>,严禁出现<version></version>—— 出现即违反契约
用 BOM 导入大型生态的版本策略
对 Spring Boot、Spring Cloud Alibaba、Guava 等自带兼容性保障的生态,直接导入其官方 BOM(Bill of Materials),比手动逐个声明更安全可靠。
- 在父 POM 的
<dependencymanagement></dependencymanagement>中添加:<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-dependencies</artifactid><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency> - BOM 内部已协调好所有子模块版本关系,避免你重复声明导致覆盖或不兼容
- 第三方 BOM(如
guava-bom)同样适用此方式,一并解决多 Guava 模块版本不一致问题
子模块按需声明依赖,不越权指定版本
子模块只负责“我要用什么”,版本决策权完全交给父 POM。这是统一性的关键执行层。
- 例如 user-service 模块需要 Web 支持:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid></dependency>—— 没有<version></version> - 若某模块需排除传递依赖(如排除低版本 Tomcat),可在该模块中用
<exclusions></exclusions>,但排除行为本身不改变版本规则 - 个性化依赖(如某个模块独用的 SDK)仍可单独声明,但建议先评估是否应提升为公共依赖并纳入父 POM 管理
配合 Enforcer 插件自动拦截违规
光靠约定不够,要用工具兜底。Maven Enforcer 插件可在构建时强制检查子模块是否误写了 <version></version> 或使用了未授权依赖。
- 在父 POM 的
<build><plugins></plugins></build>中加入:<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-enforcer-plugin</artifactid><executions><execution><id>enforce-no-version-in-dependency</id><goals><goal>enforce</goal></goals><configuration><rules><requireupperbounddeps></requireupperbounddeps><banduplicatepomdependencyversions></banduplicatepomdependencyversions></rules></configuration></execution></executions></plugin> - CI 流水线中启用该插件,能第一时间阻断不合规提交
- IDEA 中也可配置 Maven runner 自动启用 enforce goal,开发阶段就预警
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











