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

问题描述 投票:0回答:7

在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行?有

<pluginManagement>
,但它只定义了执行的配置——子模块仍然需要引用插件来执行目标:

[...] 但是,这仅配置子级中的plugins 元素中实际引用的插件。 (POM 参考)

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

更新:我已经根据帕斯卡的建议尝试过:

<!-- ... -->
<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,即使

jar
目标绑定到
integration-test
阶段。

java maven-2
7个回答
40
投票

根据默认生命周期绑定,包装

pom
的绑定是:

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

包站点:attach-descriptor
安装安装:安装
部署部署:部署

因此,如果您的父 POM 有

<packaging>pom<packaging>
(这应该是评论中指出的情况),并且如果您将插件绑定到上述之外的其他阶段(请参阅 生命周期参考 获取完整列表) ,它们不会在父 POM 的构建过程中执行。

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

正如您所指出的,您可以在父 pom 中使用

pluginManagement
来配置插件,但是如果您确实想在子模块中执行插件目标而不是在父模块中执行(您可能有很好的选择)这样做的原因,但大多数时候,插件不会对具有 pom 包装且没有任何内容的模块产生太大影响),您必须在子项中的
plugins
元素中引用插件。

应用于您的示例,父 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>



28
投票

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

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

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


11
投票
<skip>true</skip>

来实现这一点。


父pom条目如下:

<plugin> <groupId>eviware</groupId> <artifactId>maven-soapui-plugin</artifactId> <version>4.0.0</version> <inherited>false</inherited> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> </dependency> </dependencies> <configuration> <skip>true</skip> </configuration> </plugin>

子项目pom条目如下

<plugins> <plugin> <groupId>eviware</groupId> <artifactId>maven-soapui-plugin</artifactId> <version>4.0.0</version> <configuration> <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile> <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile> <outputFolder>site-service-web/target/surefire-reports</outputFolder> <junitReport>true</junitReport> <exportwAll>true</exportwAll> <printReport>true</printReport> </configuration> </plugin> </plugins>



1
投票

家长:

<build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <inherited>true</inherited> <executions> <execution> <phase>integration-test</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>

孩子

<build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <inherited>false</inherited> <executions> <execution> <phase>integration-test</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <skip>false</skip> </configuration> </plugin> </plugins> </build>



0
投票

这里的帖子描述了一种通过将插件绑定到执行 ID 和构建阶段来工作的解决方案:

如何覆盖 Maven 插件阶段的默认绑定

我会推荐给任何其他试图让它发挥作用的人。


0
投票

家长:

<properties> <skipme>true<skipme> </properties> <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <inherited>true</inherited> <executions> <execution> <phase>integration-test</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <skip>${skipme}</skip> </configuration> </plugin> </plugins> </build>

孩子:

<properties> <skipme>false<skipme> </properties>



-2
投票
<inherited>false</inherited>


请参阅

此页

了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.