web-dev-qa-db-fra.com

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 code source.

Si je définis le plugin dans le pom.xml parent, il s'exécute également pour toutes les versions enfant.

Voici mon parent 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>
56
Dougnukem

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

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

  • hérité: vrai ou faux, que cette configuration de plug-in 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 l'héritage des POM enfants:

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

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

      <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>
24
Matthew Jaskula

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

8
Maksim

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

3
Michael-O

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é.

Comme mentionné dans Mojo API Specification ,

Indique ce Mojo pour l'exécuter de manière multi-modules, c'est-à-dire agréger la génération 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
Nirav Khandhedia