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

时间:2011-10-17 23:06:05

标签: maven plugins reporting dependency-management

我有一个maven多模块项目(男孩,我已经写过在这个网站上打开方式太多次了)。几乎所有模块(即其中包含 code 的模块)都应运行maven-site-plugin来生成有关代码覆盖率等的报告。这些模块具有详细的共享配置 - 报告运行,哪些文件覆盖/排除某些插件等等。

但是,有一些模块可以处理打包 - 运行程序集插件以生成tarball等。这些都不会从运行站点报告中获得任何好处 - 没有可分析的代码,也没有可以报告的测试。 / p>

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

我想要的是 - 共享配置,对于有时被子模块禁用的插件 - 甚至可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:70)

通过“运行插件”,我假设您的意思是插件已经绑定到生命周期阶段,并且您希望在某些模块中取消绑定它。首先,您可以考虑更改POM继承,以便不需要插件的模块具有一个父节点和具有不同父节点的模块。如果您不想这样做,那么您可以在子模块中将执行阶段显式设置为“nothing”。例如。如果你有这样的父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 :(得分:2)

如果你想在父pom中压制的执行用id标记,那么Ryan Stewart的回答是有效的。但是,如果父pom没有使用id标记执行(当然,您无法编辑该父pom),那么我发现执行以下操作会抑制父pom& #39;行动。

  1. 首先将执行阶段设置为none
  2. 创建另一个执行,给它一个id并在其中执行您需要它执行的操作。
  3. 运行mvn help:effective-pom以确认它已正确抑制了您从父pom中抑制的内容。
  4. 以下是一个例子: 这就是我的父母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我可以用来禁用它。所以,这是我孩子的原因:

                <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才会执行 - 这就是我想要实现的目标。