在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行?有<pluginManagement>
,但只定义了执行的配置 - 子模块仍然需要引用插件来执行目标:
[...]但是,这只配置了子节点中plugins元素中实际引用的插件。 (POM Reference)
实现这一目标的其他任何方式?
更新:我根据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
目标绑定到integration-test
阶段,这仍会为父项目生成.jar。
答案 0 :(得分:26)
<击>
根据{{3}},包装pom
的绑定是:
默认生命周期绑定 - 打包 POM 强>
package site:attach-descriptor install install:install deploy deploy:deploy
因此,如果您的父POM有<packaging>pom<packaging>
(这应该是评论中指出的情况),并且您将插件绑定到上述其他阶段(请参阅对于全面的列表,Default Lifecycle Bindings,它们将不会在父POM的构建期间执行。
击>
(编辑:我的初步答案是错误的。如果你将插件目标绑定到特定阶段,它将在该阶段触发,无论项目的包装如何。Lifecycle Reference没有与此有关,它们只是默认的生命周期绑定。所有重要的是,插件绑定的阶段是Default Lifecycle Bindings的一部分。)
正如您所指出的,您可以使用父pom中的build lifecyle来配置插件,但是如果您真的想要在子模块中执行插件目标而在不是中执行父母(你可能有充分的理由这样做但是大多数时候,插件对于没有任何内容的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>
答案 1 :(得分:17)
所描述的插件管理解决方案当然是正确的,但在某些情况下它不适合。假设您想在子模块中运行几个jar:jar目标,每个目标都按照自己的设置(配置)执行。或者通常,当您不想强制子poms明确触发插件时。
在这种情况下,对我有用的解决方案是在特定配置文件下定义父pom中的执行,并仅在子poms中激活它,例如通过检查是否存在某个文件或属性:
<profile>
<id>generate-dc</id>
<activation>
<file>
<exists>src/main/assembly/some.xml</exists>
</file>
</activation>
然后插件不会在父节点中执行,但如果包含该文件,则会在所有子节点中执行,或者设置一些属性。
答案 2 :(得分:9)
我有一个类似的要求在孩子中运行一些插件但不是父POM。我通过在父POM中声明<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>
答案 3 :(得分:1)
在父项目的插件部分下使用<inherited>false</inherited>
。
请参阅this page以获取更多信息。
答案 4 :(得分:1)
以下配置对我有用。在父pom和子pom中添加插件。
家长:
<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>
答案 5 :(得分:0)
我尝试了Pascal的答案,但它对我不起作用。子pom中引用的插件没有执行,我假设是因为它们没有构建阶段绑定。
这里的帖子描述了一个解决方案,它通过将插件绑定到执行ID和构建阶段来工作:How to override default binding to phase of a Maven plugin
我建议其他任何人试图让这个工作。