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 compilemvn 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 版本

为了统一团队开发环境,可以通过 requireMavenVersionrequireJavaVersion 来限制最低版本:

<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 项目都引入该插件,作为构建流程的“守门人”。


原始标题:Maven Enforcer Plugin | Baeldung