在子模块上执行Maven插件目标,但不在父级上
在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行? 有<pluginManagement>
,但只定义了执行的configuration – 子模块仍然需要引用插件来执行目标:
[…]然而,这只能configuration插件,这些插件实际上是在子插件元素中引用的。 ( POM参考 )
任何其他方式来实现这一目标?
更新:我已经根据帕斯卡尔的build议尝试过了:
<!-- ... --> <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。
根据默认生命周期绑定 ,包装 pom
的绑定是:
默认生命周期绑定 – 包装pom
包站点:附加描述符 安装安装:安装 部署部署:部署
因此,如果您的父POM包含<packaging>pom<packaging>
(这应该是注释中指出的情况),并且如果您将插件绑定到上述以外的其他阶段(请参阅“ 生命周期参考”中的全面列表)他们将不会在构build父POM时被执行。
(编辑:我最初的回答是错误的,如果你将一个插件目标绑定到一个特定的阶段,它会在这个阶段被触发,而不pipe项目的包装如何。 默认的生命周期绑定与这个没有任何关系。 ,它们只是默认的生命周期绑定,所有重要的是如果插件绑定的阶段是构build生命周期的一部分)。
正如你所指出的那样,你可以在父pom中使用pluginManagement
来configuration插件,但是如果你真的想在子模块中执行一个插件目标,而不是在父项目中(你可能有很好的理由去做,但大部分在一个没有任何内容的pom
包装的模块上,插件不会有太大的影响),你必须引用子plugins
元素中的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>
所描述的插件pipe理解决scheme当然是正确的,但在某些情况下,它不适合。 假设你想在子模块中运行几个jar:jar目标,每个子目标在每次执行时都configuration自己的设置(configuration)。 或者一般来说,当你不想强迫孩子明确地触发插件。
在这种情况下,为我工作的解决scheme是在特定的configuration文件中定义父pom中的执行,并使其仅在子poms中激活,例如通过检查是否存在某个文件或属性:
<profile> <id>generate-dc</id> <activation> <file> <exists>src/main/assembly/some.xml</exists> </file> </activation>
然后,插件将不会在父项中执行,但将在所有子项中执行,如果这些插件包含该文件或设置一些属性。
我有一个类似的要求,运行一些插件在孩子,但不是父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>
我尝试了帕斯卡的回答,但是这对我没有帮助。 子pom中引用的插件没有执行,我假设,因为他们没有build立阶段的约束力。
这里的post描述了一个解决scheme,通过将插件绑定到执行ID和构build阶段: 如何覆盖默认绑定到阶段的Maven插件
我build议任何人试图得到这个工作。
在父项目的plugins部分下使用<inherited>false</inherited>
。
有关更多信息,请参阅此页面 。
这下面的configuration为我工作。 在父和子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>