1. 概述
这篇教程我们来聊聊 Maven Enforcer Plugin,看看它是如何帮助我们提升项目合规性、统一构建标准的。
在团队分布全球、协作复杂的情况下,这个插件尤其有用。它可以强制执行一些“规则”,确保所有开发者都在同一套标准下工作,避免因为环境差异导致的构建问题。
2. 插件依赖配置
要在项目中使用该插件,只需在 pom.xml
的 <plugins>
中添加如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M2</version>
</plugin>
最新版本可以在 Maven Central 查看。
3. 插件目标与配置
Maven Enforcer 插件提供了两个核心目标(goal):
enforcer:enforce
:在构建过程中执行规则检查。enforcer:display-info
:展示当前项目中配置的内置规则信息。
我们通常会在构建阶段使用 enforce
目标。可以在 <executions>
中配置它,并指定需要执行的规则:
<executions>
<execution>
<id>enforce</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<banDuplicatePomDependencyVersions/>
</rules>
</configuration>
</execution>
</executions>
✅ 这样,每次执行 mvn compile
或 mvn package
时,都会自动触发规则检查。
4. 内置规则详解
Enforcer 的核心就是“规则”(rules)。我们可以通过配置这些规则,来强制约束项目的构建行为。
4.1 禁止重复依赖声明
在多模块项目中,容易不小心在多个地方声明了相同的依赖。使用 banDuplicatePomDependencyVersions
规则可以防止这种情况:
<rules>
<banDuplicatePomDependencyVersions/>
</rules>
如果真的存在重复依赖,执行构建时会抛出如下错误:
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 1 duplicate dependency declaration in this project:
- dependencies.dependency[io.vavr:vavr:jar] ( 2 times )
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
⚠️ 踩坑提示:这个规则对 <dependencyManagement>
和 <dependencies>
中的重复声明都有效。
4.2 强制 Maven 与 Java 版本
为了统一团队开发环境,可以通过 requireMavenVersion
和 requireJavaVersion
来限制最低版本:
<requireMavenVersion>
<version>3.0</version>
</requireMavenVersion>
<requireJavaVersion>
<version>1.8</version>
</requireJavaVersion>
还可以加上自定义提示信息:
<requireMavenVersion>
<version>3.0</version>
<message>Invalid Maven version. It should, at least, be 3.0</message>
</requireMavenVersion>
✅ 支持灵活的版本范围语法,参考 官方文档。
4.3 检查环境变量
通过 requireEnvironmentVariable
可以确保某些环境变量已设置:
<requireEnvironmentVariable>
<variableName>ui</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
<variableName>cook</variableName>
</requireEnvironmentVariable>
✅ 多个变量可以重复配置。
4.4 检查激活 Profile
如果项目依赖某些 Maven Profile 才能正确构建,可以使用 requireActiveProfile
:
<requireActiveProfile>
<profiles>local,base</profiles>
<message>Missing active profiles</message>
</requireActiveProfile>
如果指定的 profile 没有被激活,构建就会失败,并输出自定义提示信息。
4.5 其他内置规则
Enforcer 提供了很多其他规则,比如:
banReleasedDependencies
:禁止使用已发布的依赖版本(用于内部开发)dependencyConvergence
:确保依赖版本收敛evaluateBeanshell
:执行自定义 BeanShell 脚本逻辑
完整规则列表请参考:Enforcer Rules Index
查看当前项目配置的规则信息:
mvn enforcer:display-info
5. 自定义规则开发
除了内置规则,我们还可以开发自己的规则类。步骤如下:
第一步:创建规则类
自定义规则类需要实现 EnforcerRule
接口并重写 execute()
方法:
public void execute(EnforcerRuleHelper enforcerRuleHelper) throws EnforcerRuleException {
try {
String groupId = (String) enforcerRuleHelper.evaluate("${project.groupId}");
if (groupId == null || !groupId.startsWith("com.baeldung")) {
throw new EnforcerRuleException("Project group id does not start with com.baeldung");
}
}
catch (ExpressionEvaluationException ex) {
throw new EnforcerRuleException( "Unable to lookup an expression "
+ ex.getLocalizedMessage(), ex );
}
}
规则不通过时,直接抛出 EnforcerRuleException
即可,无需返回布尔值。
第二步:打包并引入规则
将规则类打包成 jar,安装到本地仓库:
mvn clean install
然后在目标项目的 pom.xml
中配置使用:
<rules>
<myCustomRule implementation="com.baeldung.enforcer.MyCustomRule"/>
</rules>
⚠️ 注意:如果规则 jar 没有发布到中央仓库,必须先本地安装。
更多开发细节请参考官方文档:Writing a Custom Rule
6. 总结
Maven Enforcer Plugin 是一个简单但强大的构建控制工具,可以有效避免团队协作中的版本混乱、依赖重复等问题。它不仅提供了丰富的内置规则,还支持自定义扩展,灵活应对各种项目需求。
✅ 建议每个 Maven 项目都引入该插件,作为构建流程的“守门人”。