Exécuter l'Objectif du plugin Maven sur le module parent, mais pas sur les enfants

Nous avons un projet Maven multi-module qui utilise un profil qui définit un buildnumber-maven-plugin pour incrémenter un numéro de build, puis le vérifier dans le contrôle de source.

Si je définis le plugin dans le pom parent.xml il s'exécute pour tous les enfants construit aussi bien.

Voici mon père 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>
48
demandé sur Pascal Thivent 2009-11-04 02:48:36

5 réponses

Comme documenté dans la section Plugins de la référence pom:

Au-delà de la coordonnée standard de groupId: artifactId: version, il y a des éléments qui configurent le plugin ou cela construit une interaction avec lui.

  • inherited: true ou false, que cette configuration de plugin s'applique ou non aux pom qui héritent de celui-ci.

Il suffit donc d'ajouter <inherited>false</inherited> à la configuration buildnumber-maven-plugin pour éviter héritage chez les enfants POMs:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.0-beta-3</version>
        <inherited>false</inherited>
        ...
      </plugin>
86
répondu Pascal Thivent 2009-11-04 01:14:44

Vous pouvez ajouter <inherited>false</inherited> à la configuration du plugin pour éviter l'héritage chez les enfants POMs:

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

Ou, si votre plugin a plusieurs exécutions, vous pouvez contrôler les exécutions héritées et celles qui ne le sont pas en ajoutant la balise héritée au corps d'exécution:

<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>
23
répondu Matthew Jaskula 2011-09-19 19:21:34

Il y a une option maven intégrée: mvn --help ... -N,--non-recursive Do not recurse into sub-projects

6
répondu Maksim 2016-10-12 14:06:09

Juste un ajout aux grandes réponses ici: notez que l'héritage par exécution est brisé dans Maven 2: http://jira.codehaus.org/browse/MNG-3959

3
répondu Michael-O 2013-02-09 00:29:17

Si le plugin est personnalisé et que vous avez accès au Code Mojo du plugin, vous pouvez marquer le plugin comme aggregator; si le comportement attendu est applicable à tous les projets où le plugin doit être utilisé.

Tel Que mentionné dans Mojo Spécification de l'API ,

Signale ce Mojo pour l'exécuter de manière multi-modules, c'est-à-dire construire avec l'ensemble des projets répertoriés comme modules.

Exemple,

@Mojo(name = "createHF", inheritByDefault = false, aggregator = true)
public class CreateHFMojo extends AbstractMojo {

..

public void execute() throws MojoExecutionException, MojoFailureException {
 ....
}

..

}

Exemple détaillé sur github .

1
répondu Nirav Khandhedia 2017-06-15 15:51:48