【问题标题】:Execute Maven plugin goal on parent module, but not on children在父模块上执行 Maven 插件目标,但不在子模块上
【发布时间】: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>

【问题讨论】:

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


    【解决方案1】:

    如 pom 参考的 Plugins 部分所述:

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

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

    所以只需在 buildnumber-maven-plugin 配置中添加 &lt;inherited&gt;false&lt;/inherited&gt; 即可避免在子 POM 中继承:

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

    【讨论】:

      【解决方案2】:

      您可以在插件配置中添加&lt;inherited&gt;false&lt;/inherited&gt; 以避免在子 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上的详细示例。

            【讨论】:

              猜你喜欢
              • 2010-12-10
              • 1970-01-01
              • 1970-01-01
              • 2022-08-15
              • 2013-03-22
              • 1970-01-01
              • 1970-01-01
              • 2014-03-28
              • 1970-01-01
              相关资源
              最近更新 更多