在一个Maven多模块项目中,我如何禁用一个子模块中的插件?

57

我有一个Maven多模块项目(嗯,我在这个网站上写过太多这样的开头)。几乎所有的模块(也就是那些包含代码的模块)都应该运行maven-site-plugin来生成关于代码覆盖率等报告。这些具有详细的共享配置--要运行哪些报告,为某些插件覆盖/排除哪些文件等。

然而,有一些模块处理打包--运行汇编插件生成tarball等。这些不需要运行站点报告--没有需要分析的代码,也没有需要报告的测试。

因此,我有很多需要共享插件配置的模块,以及一些根本不需要运行插件的模块,最好完全不运行。如果我把插件放在父POM的<build>部分中,我可以做到前者(共享配置),但我似乎无法在需要时关闭插件。如果我将配置推到每个模块自己的POM中,我可以做到后者(避免运行插件),但我无法找到共享配置信息的好方法。

我想要的--对于有时被子模块禁用的插件进行共享配置--是否可能?如果可能,怎么做?

2个回答

82

如果您说“运行插件”,我假定这个插件被绑定到一个生命周期阶段,并且您想在某些模块中解除其绑定。首先,您可以考虑更改POM继承关系,使不需要插件的模块有一个父级,需要插件的模块有一个不同的父级。如果您不想这么做,那么您可以在子模块中将执行阶段显式设置为“无”。例如,如果您有类似以下的父级pom配置:

<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,它覆盖了父项目中指定的配置,现在该插件未绑定到子项目的任何阶段。


1
太棒了,我知道它会是这样的,但我还是有点像黄带(如果你从我最近的Maven问题中没有猜到的话)。由于这个原因,我不能将项目移动到不同的父级。但我会解除报告插件的绑定。谢谢! - Coderer
5
如果父模块中未指定插件的 <phase>,则此方法将无法使用。 - EvgeniySharapov
7
在这种情况下,您仍然可以在子模块中使用<phase>none</phase>,请参见此答案 - Michael Paesold

3
如果您希望抑制父POM中希望执行的操作已标记为id,那么Ryan Stewart的答案有效。 但是,如果父POM未使用id标记执行(当然,您无法编辑该父POM),则我发现执行以下操作可以抑制父POM的操作。
  1. 首先将执行的阶段设置为none
  2. 创建另一个执行程序,并给它一个id,在其中执行所需的操作。
  3. 运行mvn help:effective-pom以确认已正确抑制了来自父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>

作为结果,这是effective-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被执行——这正是我想要实现的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接