dependencymanagement 是 maven 多模块项目统一控版的核心机制,通过父 pom 的 声明依赖版本、支持属性变量和 bom 导入,子模块仅声明坐标不写 version,配合 enforcer 插件校验与 dependency:tree 验证确保版本真正锁死。

dependencyManagement 是 Maven 多模块项目中统一控版的核心机制,它不直接引入依赖,而是为子模块提供“版本承诺”——只要子模块声明了该坐标,就自动采用父工程指定的版本。
在父 POM 中集中声明版本
把所有共用依赖的 groupId、artifactId 和 version 写进父工程的 <dependencymanagement></dependencymanagement> 块里。这里只做声明,不触发下载或编译依赖。
- 支持用
<properties></properties>定义变量(如<lombok.version>1.18.32</lombok.version>),再在<dependencymanagement></dependencymanagement>中引用,改一个地方全局生效 - 对 Spring Cloud Alibaba 等 BOM 类型依赖,可用
<scope>import</scope>+<type>pom</type>整体导入其内部管理的全部版本 - 子模块即使被第三方库带入旧版(比如 log4j-core 2.14.1),只要父 POM 声明了 2.17.2,Maven 依赖调解规则就会优先采用这个版本
子模块只写坐标,不写 version
子模块自己的 <dependencies></dependencies> 里,只需写 <groupid></groupid> 和 <artifactid></artifactid>,绝对不要出现 <version></version> 标签。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如父 POM 锁定了
com.fasterxml.jackson.core:jackson-databind:2.15.3,子模块只需:<dependency><br> <groupid>com.fasterxml.jackson.core</groupid><br> <artifactid>jackson-databind</artifactid><br></dependency>
- 若某个模块确需不同版本,可显式写出
<version></version>覆盖,但必须加注释说明原因,避免破坏整体一致性
用 Enforcer 插件防止手误
<dependencymanagement></dependencymanagement> 管得住声明,管不住人写错。Enforcer 插件能自动拦截违规行为:
- 在父 POM 的
<build><plugins></plugins></build>中配置,启用banDuplicatePomDependencyVersions或自定义校验规则 - 运行
mvn enforcer:enforce可提前发现:子模块私自写了<version></version>、传递依赖引入了未授权版本等问题 - 建议在 CI 流水线中强制执行,把问题挡在构建阶段
验证是否真正锁死
配置写完不等于生效,必须验证实际解析结果:
- 执行
mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-core - 查看输出中
resolved to后面的版本号,确认是你在父 POM 中声明的那个 - 注意区分
omitted for duplicate和omitted for conflict——前者说明版本已统一,后者可能意味着锁定未生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










