2017-03-31 46 views
1

Maven插件管理怪异的行为我有一个定义与Maven的万无一失,插件

<pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.19.1</version> 
        <configuration> 
         <parallel>classesAndMethods</parallel> 
         <threadCount>4</threadCount> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

我从POM继承,但不会宣布在它的插件部分的插件子项目父POM。 我仍然看到插件在我运行maven测试目标时生效。

+0

Pom是否指其父?你在哪里运行mvn? –

+0

是的。子项目是指其父项。我在子模块根文件夹中运行maven目标。 – Shibashis

+0

如果它引用它的父项,它将从那里获取配置。 –

回答

-1

当父项目定义Maven的万无一失插件 参见:http://maven.apache.org/surefire/maven-surefire-plugin/usage.html

<pluginManagement> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
    </plugin> 
    </plugins> 
</pluginManagement> 

添加配置部分使其在每个子项目隐含的执行。

在子项目的配置看起来像

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <parallel>classesAndMethods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

即使在子项目的配置是相当冗长,它可以确保明确的另外的依赖,并在所有子相同版本的插件的模块。

+0

不知道这个答案解释。当你说“小孩项目非常冗长”时,你是在谈论手动添加插件给孩子吗?如果是的话,那么你不需要这样做。您甚至不需要在子项目中声明任何有关该插件的内容。 'pluginManagement'中的所有配置都应该自动从父项继承。这个答案并没有说明为什么这种继承是完成的。 – manouti

+0

'plugin'节中的任何配置都会自动继承。只有在子项目的插件部分中明确指定时,才会添加“pluginManagement”部分中的任何配置。在'pluginmanagement'中定义配置的优点是所有子模块都使用相同的插件版本。 – Shibashis

0

这很正常,因为maven-surefire-plugin默认绑定到test阶段,作为built-in lifecycle bindings的一部分。无需在子项目中声明它。

换句话说,该插件对子项目隐式可用,因为它将自身绑定到test阶段。 maven-scm-plugin(在另一个问题中链接)没有默认绑定到任何阶段,因此您必须在子项中声明它以从父项继承配置。但是因为maven-surefire-plugin默认绑定到测试阶段,所以您不需要在子项中声明它。尝试在子模块中运行mvn help:effective-pom以查看有效的POM,其中显示了Maven实际使用的最终POM。检查http://maven.apache.org/ref/3.3.9/maven-core/default-bindings.html以查看默认插件绑定。

如果您想跳过该插件,只需执行mvn install或通过-DskipTests=true。如果您仍然需要运行mvn test到其他项目运行测试,你可以在子模块的POM跳过测试(虽然这不是建议):

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
       <skipTests>true</skipTests> 
     </configuration> 
    </plugin> 
</plugins> 
+0

你可以请看看我在问题上添加的两条评论? – Shibashis

+0

@Shibashis链接问题中的示例具有一个插件,该插件将在孩子中声明。然而,对于像'maven-surefire-plugin'和'maven-jar-plugin'这样的插件,默认情况下它们已经被绑定到构建阶段。我会说可以改进文档来添加这个注释。为了确认这一点,[插件文档](http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html)提到了这一点:“默认绑定到生命周期阶段:测试。” – manouti

+0

我知道插件将自身绑定到测试阶段。但是我的问题是为什么插件会隐式地在子项目中可用。 – Shibashis

相关问题