在子模块上执行 Maven 插件目标,但不在父模块上执行

2022-08-31 13:33:29

在多模块项目中,如何指定要在所有子模块中执行插件目标,但不在父项目中执行?有 ,但这只定义了执行的配置 -- 子模块仍然需要引用插件来执行目标:<pluginManagement>

[...]但是,这仅配置在子级的插件元素中实际引用的插件。聚甲酸参考

还有其他方法可以实现这一目标吗?

更新:我根据Pascal的建议尝试了这个:

<!-- ... -->
<packaging>pom</packaging>
<modules>
  <module>child</module>
</modules>

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<!-- ... -->

这仍将为父项目生成.jar,即使目标绑定到阶段也是如此。jarintegration-test


答案 1

根据默认生命周期绑定,打包 pom 的绑定是:

默认生命周期绑定 - 打包 pom

package       site:attach-descriptor  
install       install:install  
deploy        deploy:deploy

因此,如果您的父POM有一个(正如注释中指出的那样,这应该是这种情况),并且如果您将插件绑定到上述阶段以外的其他阶段(请参阅生命周期参考以获取完整列表),则在构建父POM期间不会执行它们。<packaging>pom<packaging>

(编辑:我最初的答案是错误的。如果将插件目标绑定到特定阶段,则无论项目的打包如何,都将在该阶段触发该目标。默认生命周期绑定与此没有任何关系,它们只是默认的生命周期绑定。重要的是插件绑定到的阶段是否是构建生命周期的一部分。

正如你所指出的,你可以使用父 pom 中的 pluginManagement 来配置插件,但是如果你真的想在子模块而不是父模块中执行插件目标(你可能有很好的理由这样做,但大多数时候,插件在包装上没有任何内容的模块上不会有太多的效果), 您必须在子元素中引用插件。pomplugins

应用于您的示例,父 pom.xml 可以定义以下规范:

<project>
  <packaging>pom</packaging>
  ...
  <modules>
    <module>child</module>
  </modules>
  ...
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.2</version>
          <executions>
            <execution>
              <id>my-execution-id</id>
              <phase>integration-test</phase>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        ...
      </plugins>
    </pluginManagement>
  </build>
  ...
</project>

在每个孩子中,只需要以下几点:pom.xml

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
    </plugins>
    ...
  </build>
</project>

答案 2

所描述的插件管理解决方案当然是正确的,但在某些情况下它不适合。假设您希望在子模块中运行多个 jar:jar 目标,每个目标在每次执行时都配置了自己的设置(配置)。或者一般来说,当你不想强迫子poms显式触发插件时。

在这种情况下,对我有用的解决方案是在特定配置文件下的父pom中定义执行,并仅在子pom中激活它,例如通过检查某些文件或属性是否存在:

<profile>
    <id>generate-dc</id>
    <activation>
        <file>
            <exists>src/main/assembly/some.xml</exists>
        </file>
    </activation>

然后插件将不会在父级中执行,但将在所有子级中执行,如果这些子级包含该文件或设置某些属性。


推荐