Maven Enforcer 插件通过提前拦截、自动校验、统一 enforce 实现依赖规范,核心是 DependencyConvergence 规则强制同一依赖版本收敛,配合 dependencyManagement 锁定版本、requireProperty 验证变量一致性,并在 CI 中强制执行阻断不合规构建。

用 Maven Enforcer 插件规范依赖版本,核心是“提前拦截、自动校验、统一 enforce”,不是靠人工检查 pom 写法,而是让构建过程自己拒绝不合规的依赖。
配置 DependencyConvergence 规则防版本冲突
这是最常用也最有效的做法。它强制要求:项目中所有路径引入的同一个依赖,必须收敛到唯一版本。一旦发现 A 依赖 log4j 2.17.1、B 依赖 log4j 2.20.0,构建直接失败。
- 在父 POM 的 <build><plugins> 中添加插件声明,指定 DependencyConvergence 规则
- 无需手动写 version,只要某子模块或其传递依赖带入了不同版本,就会触发失败
- 配合 mvn dependency:tree -Dverbose 可定位具体哪条路径引入了冲突版本
结合 <dependencyManagement> 锁定版本再校验
<dependencyManagement> 声明版本只是起点,Enforcer 是守门人。两者搭配才能真正落地管控:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 父 POM 用 <dependencyManagement> 统一声明 jackson-databind:2.15.3
- 子模块 只写 groupId + artifactId,绝不写 version
- Enforcer 插件启用 banDuplicatePomDependencyVersions 或自定义规则,检查子模块是否偷偷写了 version
- 这样既防止手误覆盖,也避免间接依赖绕过声明
用 requireProperty 验证版本变量一致性
如果项目用 <properties> 定义版本变量(如 <lombok.version>1.18.32</lombok.version>),可让 Enforcer 强制校验这些变量是否被实际使用:
- 配置 requireProperty 规则,要求所有 xxx.version 属性必须出现在 <dependencyManagement> 或 <dependencies> 中
- 防止定义了 lombok.version 却没在任何地方引用,造成“假统一”
- 也能拦截拼写错误,比如把 spring-boot.version 写成 springboot.version
CI 流水线中强制执行,不通过就不合入
本地跑通不等于安全。必须把 Enforcer 检查嵌入 CI:
- 在 Jenkins/GitHub Actions 的构建步骤中加入 mvn enforcer:enforce
- 设置失败时阻断 PR 合并或流水线发布
- 避免“我本地没问题”式问题流入测试或生产环境
- 可搭配 -Denforcer.skip=false 确保不被跳过(默认已生效)

















