在父模块上执行 Maven 插件目标,但不在子模块上
Posted
技术标签:
【中文标题】在父模块上执行 Maven 插件目标,但不在子模块上【英文标题】:Execute Maven plugin goal on parent module, but not on children 【发布时间】:2010-12-12 20:33:18 【问题描述】:我们有一个多模块 maven 项目,它使用定义 buildnumber-maven-plugin 的配置文件来增加内部版本号,然后将其签入源代码控制。
如果我在父 pom.xml 中定义插件,它也会为所有子构建执行。
这是我的父 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.webwars</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<properties>
<buildNumber.properties>$basedir/../parent/buildNumber.properties</buildNumber.properties>
</properties>
<version>1.0-SNAPSHOT</version>
<name>Parent Project</name>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<buildNumberPropertiesFileLocation>$buildNumber.properties</buildNumberPropertiesFileLocation>
<getRevisionOnlyOnce>true</getRevisionOnlyOnce>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
<format>0, number</format>
<items>
<item>buildNumber</item>
</items>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>checkin</goal>
</goals>
</execution>
</executions>
<configuration>
<basedir>$basedir</basedir>
<includes>buildNumber.properties</includes>
<message>[Automated checkin] of $basedir Build version: $major.version.$minor.version.$buildNumber</message>
<developerConnectionUrl>...</developerConnectionUrl>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<modules>
<module>../common</module>
<module>../data</module>
<module>../client</module>
<module>../webplatform</module>
</modules>
...
</project>
【问题讨论】:
【参考方案1】:如 pom 参考的 Plugins 部分所述:
除了 groupId:artifactId:version 的标准坐标之外,还有一些元素可以配置插件或与它建立交互。
inherited: true 或 false,此插件配置是否应应用于从该插件继承的 POM。
所以只需在 buildnumber-maven-plugin 配置中添加 <inherited>false</inherited>
即可避免在子 POM 中继承:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<inherited>false</inherited>
...
</plugin>
【讨论】:
【参考方案2】:您可以在插件配置中添加<inherited>false</inherited>
以避免在子 POM 中继承:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<inherited>false</inherited>
...
</plugin>
或者,如果您的插件有多个执行,您可以通过将继承标签添加到执行主体来控制哪些执行被继承,哪些不被继承:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>parent-only</id>
<phase>initialize</phase>
<inherited>false</inherited>
<configuration>
<target>
<echo message="Echoed only by this module."/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>all-modules</id>
<phase>initialize</phase>
<inherited>true</inherited> <!-- Defaults to true, so you could leave this line out -->
<configuration>
<target>
<echo message="Echoed in this module and each child module."/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
【讨论】:
【参考方案3】:有一个内置的maven选项:
mvn --help
...
-N,--non-recursive Do not recurse into sub-projects
【讨论】:
【参考方案4】:这里只是对出色答案的补充:请注意,Maven 2 中的每个执行继承被破坏:http://jira.codehaus.org/browse/MNG-3959
【讨论】:
【参考方案5】:如果插件是自定义插件并且您可以访问插件MOJO代码,您可以将插件标记为aggregator
;如果预期的行为适用于要使用插件的所有项目。
如Mojo API Specification 中所述,
标记这个 Mojo 以多模块方式运行它,即聚合 使用作为模块列出的项目集进行构建。
例子,
@Mojo(name = "createHF", inheritByDefault = false, aggregator = true)
public class CreateHFMojo extends AbstractMojo
..
public void execute() throws MojoExecutionException, MojoFailureException
....
..
github上的详细示例。
【讨论】:
以上是关于在父模块上执行 Maven 插件目标,但不在子模块上的主要内容,如果未能解决你的问题,请参考以下文章
Maven中plugins和pluginManagement的区别