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

时间:2009-11-03 23:48:36

标签: version-control maven-2 build-process versioning

我们有一个多模块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>

5 个答案:

答案 0 :(得分:89)

如pom参考文献的Plugins部分所述:

  

除了groupId:artifactId:version的标准坐标之外,还有一些元素可以配置插件或者与之建立交互。

     
      
  • 继承: true或false,此插件配置是否应该应用于从此继承的POM。
  •   

所以只需将<inherited>false</inherited>添加到buildnumber-maven-plugin配置中,以避免在子POM中继承:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.0-beta-3</version>
        <inherited>false</inherited>
        ...
      </plugin>

答案 1 :(得分:24)

您可以将<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>

答案 2 :(得分:8)

有一个内置的maven选项: mvn --help ... -N,--non-recursive Do not recurse into sub-projects

答案 3 :(得分:3)

这里只是对这些重要答案的补充:请注意,Maven 2中的每次执行继承被打破:http://jira.codehaus.org/browse/MNG-3959

答案 4 :(得分:1)

如果插件是自定义的,并且您可以访问插件MOJO代码,则可以将插件标记为public List<T> GetDonuts<T>() where T : class, new() { ;如果预期行为适用于要使用插件的所有项目。

Mojo API Specification中所述,

  

标记此Mojo以多模块方式运行它,即聚合   使用列为模块的项目集构建。

示例,

aggregator

github上的详细示例。