web-dev-qa-db-fra.com

Dans un projet multi-module Maven, comment puis-je désactiver un plugin chez un enfant?

J'ai un projet multi-module maven (garçon, j'ai écrit cette ouverture de manière trop de fois sur ce site). Presque tous les modules (c'est-à-dire ceux qui contiennent du code ) devraient exécuter le plug-in maven-site pour générer des rapports sur la couverture du code, etc. Ceux-ci ont une configuration partagée détaillée - quels rapports exécuter, quels fichiers couvrir/exclure pour certains plugins, etc.

Cependant, il existe quelques modules qui traitent de l'empaquetage - exécuter le plugin Assembly pour générer une archive tar, etc. Ceux-ci ne gagnent rien à exécuter un rapport de site - il n'y a pas de code à analyser, pas de tests à signaler.

J'ai donc beaucoup de modules qui doivent partager la configuration du plugin, et quelques modules qui doivent ne pas exécuter le plugin, de préférence du tout. Je peux faire l'ancien (partager la configuration) si je mets le plugin dans le <build> section du parent POM, mais je n'arrive pas à désactiver le plugin quand je dois dans ce cas. Je peux faire ce dernier (éviter d'exécuter le plugin) si je pousse la configuration vers le bas pour le POM de chaque module, mais je ne peux pas trouver un bon moyen de partager les informations de configuration dans ce cas.

Est-ce que ce que je veux - une configuration partagée, pour un plugin qui est parfois désactivé par un module enfant - est-il même possible? Si c'est le cas, comment?

43
Coderer

Par "exécuter le plugin", je suppose que vous voulez dire que le plugin est lié à une phase de cycle de vie, et que vous souhaitez le dissocier dans certains modules. Tout d'abord, vous pouvez envisager de modifier votre héritage POM afin que les modules qui n'ont pas besoin des plugins aient un parent et ceux qui ont un parent différent. Si vous ne voulez pas le faire, vous pouvez explicitement définir la phase d'exécution sur "rien" dans un module enfant. Par exemple. si vous aviez une configuration de pom parent comme celle-ci:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase>initialize</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                ... lots of configuration
            </configuration>
        </execution>
    </executions>
</plugin>

Ensuite, dans un module enfant, vous pouvez faire ceci:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase/>
        </execution>
    </executions>
</plugin>

Étant donné qu'il s'agit du même plug-in et du même identifiant d'exécution, il remplace la configuration spécifiée dans le parent, et maintenant le plug-in n'est pas lié à une phase dans le projet enfant.

74
Ryan Stewart

La réponse de Ryan Stewart fonctionne si l'exécution que vous souhaitez supprimer dans le pom parent est marquée avec un id. Si, cependant, le pom parent ne marque pas l'exécution avec un id (et, bien sûr, vous ne pouvez pas modifier ce pom parent), j'ai constaté que la procédure suivante supprime l'action du pom parent.

  1. Définissez d'abord la phase de l'exécution sur none
  2. Créez une autre exécution, donnez-lui un id et faites-y ce que vous voulez.
  3. courir mvn help:effective-pom pour confirmer qu'il a correctement supprimé ce dont vous aviez besoin, supprimé du pom parent.

Voici un exemple: Voici à quoi ressemblait mon pom parent:

    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.1.2</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
      <inherited>true</inherited>
    </plugin>

Je devais changer l'objectif en jar-no-fork. Notez que l'exécution dans le pom parent n'a pas de id que je pourrais utiliser pour le désactiver. Voici donc ce qui a ajouté à mon enfant pom:

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

En conséquence, voici à quoi ressemble le pom efficace:

      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.2.1</version>
        <executions>
          <execution>
            <phase>none</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
        </executions>
        <inherited>true</inherited>
        <configuration>
          <archive>
            <compress>false</compress>
          </archive>
        </configuration>
      </plugin>

Ainsi, l'objectif jar ne fonctionne jamais et seul l'objectif jar-no-fork s'exécute - c'est ce que je voulais réaliser.

2
Alok Lal