核心是用好<dependencyManagement>+属性变量+继承机制:父POM在<dependencyManagement>中集中声明依赖版本并用<properties>定义变量,子模块只写groupId和artifactId、禁用version,配合BOM导入和Enforcer插件自动校验。

在多模块 Maven 项目中统一控制依赖版本,核心是用好 <dependencyManagement> + 属性变量 + 继承机制,而不是靠子模块各自写 <version>。这样改一处就全局生效,避免遗漏、冲突和维护成本。
父 POM 中集中声明依赖版本
所有共用依赖(如 Spring Boot、Jackson、Logback、Lombok 等)必须在父工程的 <dependencyManagement> 块中声明版本,且只声明、不引入——它只是“承诺”,不是“安装”。
- 在父 POM 的
<properties>中定义版本变量:<spring-boot.version>3.3.3</spring-boot.version><logback.version>1.4.14</logback.version> - 在
<dependencyManagement> <dependencies>中引用这些变量:<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version> - 子模块的
<dependencies>里只写<groupId>和<artifactId>,严禁出现<version>—— 出现即违反契约
用 BOM 导入大型生态的版本策略
对 Spring Boot、Spring Cloud Alibaba、Guava 等自带兼容性保障的生态,直接导入其官方 BOM(Bill of Materials),比手动逐个声明更安全可靠。
- 在父 POM 的
<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。这是统一性的关键执行层。
立即学习“Java免费学习笔记(深入)”;
- 例如 user-service 模块需要 Web 支持:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>—— 没有<version> - 若某模块需排除传递依赖(如排除低版本 Tomcat),可在该模块中用
<exclusions>,但排除行为本身不改变版本规则 - 个性化依赖(如某个模块独用的 SDK)仍可单独声明,但建议先评估是否应提升为公共依赖并纳入父 POM 管理
配合 Enforcer 插件自动拦截违规
光靠约定不够,要用工具兜底。Maven Enforcer 插件可在构建时强制检查子模块是否误写了 <version> 或使用了未授权依赖。
- 在父 POM 的
<build><plugins>中加入:<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 /><banDuplicatePomDependencyVersions /></rules></configuration></execution></executions></plugin> - CI 流水线中启用该插件,能第一时间阻断不合规提交
- IDEA 中也可配置 Maven runner 自动启用 enforce goal,开发阶段就预警


















