在一个Maven多模块项目中,我怎样才能禁用一个孩子的插件?

我有一个maven多模块项目(男孩,我已经写了这个开放的方式太多次在这个网站上)。 几乎所有的模块(也就是那些有代码的模块)都应该运行maven-site-plugin来生成关于代码覆盖率的报告等。这些模块有一个详细的共享configuration – 要运行的报告,要覆盖哪些文件/排除某些插件等

然而,有几个模块可以处理打包 – 运行程序集插件来生成压缩包等。这些模块无法运行站点报告 – 没有可用于分析的代码,也没有可用于报告的testing。

所以我有很多需要共享插件configuration的模块,还有一些需要不运行插件的模块。 如果我把插件放在父POM的<build>部分中,我可以做前者(共享configuration),但在这种情况下,我似乎无法closures插件。 如果我将configuration向下推送到每个模块自己的POM,我可以做后者(避免运行插件),但是在这种情况下,我找不到一个分享configuration信息的好方法。

是我想要的 – 共享configuration,有时被一个子模块禁用的插件 – 甚至可能吗? 如果是这样,怎么样?

通过“运行插件”,我假设你的意思是插件被绑定到生命周期阶段,并且你想在一些模块中解除绑定。 首先,您可以考虑更改您的POMinheritance,以便不需要插件的模块具有一个父代,而那些具有不同父代的模块。 如果你不想这样做,那么你可以在子模块中明确地将执行阶段设置为“无”。 例如,如果你有一个像这样的父pomconfiguration:

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>i-do-something</id> <phase>initialize</phase> <goals> <goal>exec</goal> </goals> <configuration> ... lots of configuration </configuration> </execution> </executions> </plugin> 

然后在一个子模块中,你可以这样做:

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>i-do-something</id> <phase/> </execution> </executions> </plugin> 

因为它是相同的插件和相同的执行ID,所以它将覆盖在父项中指定的configuration,现在该插件没有绑定到子项目中的阶段。

瑞恩·斯图尔特(Ryan Stewart)的答案是,如果你希望在父pom中压制的执行被标记为id , 但是,如果父pom没有用id标记执行(当然,你不能编辑父pom),那么我发现执行以下操作会抑制父pom的操作。

  1. 首先将执行阶段设置为none
  2. 创build另一个执行,给它一个id ,并在其中做你需要做的事情。
  3. 运行mvn help:effective-pom来确认它已经正确地抑制了你需要从父pom中抑制的东西。

下面是一个例子:这就是我父母的样子:

  <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <inherited>true</inherited> </plugin> 

我需要将目标转换为jar-no-fork 。 请注意,父pom中的执行没有我可以用来禁用它的id 。 所以这是什么添加到我的孩子POM:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <phase>none</phase> </execution> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> 

因此,这是有效的POM如何看起来像:

  <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <phase>none</phase> <goals> <goal>jar</goal> </goals> <configuration> <archive> <compress>false</compress> </archive> </configuration> </execution> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> <configuration> <archive> <compress>false</compress> </archive> </configuration> </execution> </executions> <inherited>true</inherited> <configuration> <archive> <compress>false</compress> </archive> </configuration> </plugin> 

这确保目标jar永远不会运行,只有目标jar-no-fork执行 – 这是我想实现的。