在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行?有
<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
阶段。
根据默认生命周期绑定,包装
pom
默认生命周期绑定 - 打包 pom
包站点:attach-descriptor 安装安装:安装 部署部署:部署
因此,如果您的父 POM 有
<packaging>pom<packaging>
(编辑:我最初的答案是错误的。如果您将插件目标绑定到特定阶段,则无论项目的打包如何,它都会在该阶段被触发。默认生命周期绑定没有任何内容这样做,它们只是默认的生命周期绑定。重要的是插件绑定的阶段是否是构建生命周期的一部分。)
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>
在这种情况下,对我有用的解决方案是在特定配置文件下定义父 pom 中的执行,并仅在子 pom 中激活它,例如通过检查某些文件或属性是否存在:
<profile>
<id>generate-dc</id>
<activation>
<file>
<exists>src/main/assembly/some.xml</exists>
</file>
</activation>
那么插件将不会在父级中执行,但如果子级包含该文件或设置某些属性,则会在所有子级中执行。
<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>
<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>
家长:
<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>