【问题标题】:In a Maven multi-module project, how can I disable a plugin in one child?在 Maven 多模块项目中,如何禁用一个孩子的插件?
【发布时间】:2011-12-09 16:21:48
【问题描述】:

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

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

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

我想要的——共享配置,有时被子模块禁用的插件——甚至可能吗?如果有,怎么做?

【问题讨论】:

    标签: maven plugins reporting dependency-management


    【解决方案1】:

    通过“运行插件”,我假设您的意思是插件绑定到生命周期阶段,并且您希望在某些模块中取消绑定它。首先,您可以考虑更改您的 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,所以覆盖了父项中指定的配置,现在插件没有绑定到子项目中的某个阶段。

    【讨论】:

    • 太棒了,我知道它会是这样的,但我仍然是一个黄带(如果你没有从我最近的历史中的 Maven 问题的踪迹中猜到)。由于this,我无法将项目移动到不同的父级,但我将取消绑定报告插件。谢谢!
    • 如果父模块中没有为插件指定&lt;phase&gt;,则此方法无效。
    • @evgeniysharapov 在这种情况下,您仍然可以在子模块中使用&lt;phase&gt;none&lt;/phase&gt;,请参阅this answer
    【解决方案2】:

    如果您希望在父 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>
    

    因此,这就是有效 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 执行——这是我想要实现的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多