如何使用 Maven Enforcer 插件?

Posted

技术标签:

【中文标题】如何使用 Maven Enforcer 插件?【英文标题】:How to use of the Maven Enforcer plugin? 【发布时间】:2011-10-08 22:59:35 【问题描述】:

我想使用 Maven Enforcer 插件来检查我的路径上是否有重复的类。

我已经尝试过来自here 的示例。

但是当我这样运行它时:

mvn enforcer:enforce

我收到此错误:

未能执行目标 org.apache.maven.plugins:maven-enforcer-plugin:1.0.1:enforce 项目数据填充器上的(默认-cli):参数“规则”用于 目标 org.apache.maven.plugins:maven-enforcer-plugin:1.0.1:enforce 是 丢失或无效

有没有办法正确使用它?

编辑#1

如果将我的配置更改为:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>1.0.1</version>
            <executions>
                <execution>
                    <id>enforce-versions</id>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <AlwaysPass />
                        </rules>
                        <fail>true</fail>
                    </configuration>
                </execution>
            </executions>
        </plugin>

产生同样的错误。

【问题讨论】:

【参考方案1】:

我不知道为什么它在执行配置时不起作用,但这对我有用:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>1.0</version>
            <configuration>
                <rules>
                    <banDuplicateClasses>
                        <findAllDuplicates>true</findAllDuplicates>
                    </banDuplicateClasses>
                </rules>
                <fail>false</fail>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>extra-enforcer-rules</artifactId>
                    <version>1.0-alpha-1</version>
                </dependency>
            </dependencies>
        </plugin>

【讨论】:

【参考方案2】:

你的第一个版本不工作的原因是因为执行标签内的插件配置和执行标签外的插件配置之间存在差异。仅当您的插件由完整 Maven 构建的特殊阶段触发时才使用执行。

Maven guide to configuration 解释得更好:

标签内部的配置与外部的配置不同,它们不能在直接命令行调用中使用。相反,它们仅在调用它们绑定到的生命周期阶段时应用。或者,如果您将配置部分移到执行部分之外,它将全局应用于插件的所有调用。

【讨论】:

强制目标是bound 到生命周期阶段validate。因此,要执行enforcer:enforce,您只需输入mvn validate 缺少配置文件,有没有办法在不调用validate 的情况下定义执行?我有一个场景,我只是想验证requireReleaseDeps,但在构建过程的这个阶段没有别的。【参考方案3】:

试试这个,将配置移到执行之外,这样它就不会绑定到生命周期阶段。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>enforce-versions</id>
            <goals>
                <goal>enforce</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <rules>
            <AlwaysPass />
        </rules>
        <fail>true</fail>
    </configuration>
</plugin>

现在当您执行mvn enforcer:enforce 时,它会从您的 pom.xml 中选择规则。

【讨论】:

【参考方案4】:

看到这些answers

您可以使用特殊的默认命令行执行 ID,default-cli 来调用它(请参阅Maven Docs),请参阅下面的示例。这至少适用于 3.1.1,并且引用的文章说它应该适用于 2.2.0+

mvn enforcer:enforce

但是,如果您使用 above Maven 3.1.1(我可以确认它在 3.3.3 中使用 enforcer v 1.4.1),您可以指定执行 ID您希望使用新的 @ 语法(参见 Maven JIRA 和上面的答案);

例如下面的例子使用

mvn enforcer:enforce@dependency-convergence

这是我的 pom 中的一个 sn-p;

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>1.4.1</version>
            <executions>
                <execution>
                    <id>dependency-convergence</id>
                    <phase>install</phase>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <DependencyConvergence />
                        </rules>
                        <fail>true</fail>
                    </configuration>
                </execution>
                <execution>
                    <id>default-cli</id>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <DependencyConvergence/>
                        </rules>
                        <fail>true</fail>
                    </configuration>
                </execution>
            </executions>
        </plugin>
      ...

【讨论】:

我刚刚提出拉取请求以澄清有关此的文档:github.com/apache/maven-site/pull/7

以上是关于如何使用 Maven Enforcer 插件?的主要内容,如果未能解决你的问题,请参考以下文章

关于maven的规则插件:Maven Enforcer plugin

使用 Maven 执行器跳过模块

maven-enforcer-plugin - 在 Maven 中配置的位置

如何快速找到冲突jar包

使用 maven 插件执行器规则失败

未能执行目标 org.apache.maven.plugins:maven-enforcer-plugin