2011-07-19 66 views
6

我想使用maven执行者插件来检查我的路径上是否有重复的类。我试过here的例子。使用maven执行者插件

但是当我运行它像这样:

mvn enforcer:enforce

我得到这个:

未能执行目标 org.apache.maven.plugins:Maven的实施者 - 插件: 1.0.1:在项目数据填充器上强制执行 (default-cli):参数 目标org.apache.maven.plugins:maven-enforcer-plugin:1.0.1:强制为 缺失或无效

有没有办法正确使用它?

编辑#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> 

产生相同的错误。

回答

15

之所以你的第一个版本,没有工作是因为有一个执行标签内的插件配置与执行标签外的插件配置之间的差异。只有当您的插件由完整的Maven构建的特殊阶段触发时才会执行此执行。

Maven guide to configuration更好地解释它:

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

+4

执行目标是[bound](http://maven.apache.org/enforcer/maven-enforcer-plugin/enforce-mojo.html)到生命周期阶段'validate'。因此,要执行'执行者:执行',你可以简单地输入 'mvn validate' – rwitzel

+2

配置文件短缺,有没有一种方法来定义执行而不调用'validate'?我有一个场景,我只想验证'requireReleaseDeps',但在构建过程的这个阶段没有其他任何东西。 – Snekse

3

我不知道为什么它不会与执行的配置是工作,但这个工作对我来说:

 <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> 
11

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

<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中选择规则。

3

看到这些answers

您可以使用特殊的默认命令行执行ID,默认CLI来调用它(见Maven Docs),见下面我的例子。这个工程至少在3.1.1和引用的文章说,它应该与2.2.0+

mvn enforcer:enforce 

不过工作,如果你正在使用上述 Maven的3.1。1(我可以通过执行者v 1.4.1确认它在3.3.3中可用),您可以使用新的@语法指定您希望的执行ID(请参阅Maven JIRA以及上述答案);

例如对于以下示例使用

mvn enforcer:[email protected] 

这是我的pom片段;

<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> 
     ... 
+0

我刚刚提出了一个拉请求来澄清有关此文档:https://github.com/apache/maven-site/pull/7 –