Dans un projet Maven multi-modules, Comment puis-je désactiver un plugin en un seul enfant?

j'ai un projet maven multi-modules (garçon, j'ai écrit que l'ouverture chemin trop de fois sur ce site). Presque tous les modules (c'est-à-dire ceux qui ont code en eux) devraient exécuter le maven-site-plugin 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 y a quelques modules cela concerne l'empaquetage -- exécuter le plugin assembly pour générer une boule de Tarzan, etc. Il n'y a aucun code à analyser, aucun test à signaler.

donc j'ai beaucoup de modules qui ont besoin de partager la configuration du plugin , et quelques modules qui ont besoin de ne pas exécuter le plugin , de préférence. Je peux faire la première (configuration de partage) si je mets le plugin dans la section <build> de la POM mère, mais je ne peux pas sembler éteindre le plugin quand j'en ai besoin dans ce cas. Je peux faire ce dernier (éviter d'exécuter le plugin) si je pousse la configuration vers le bas de chaque module POM propre, mais je ne peux pas trouver un bon moyen de partager les informations de configuration dans ce cas.

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

37
demandé sur Kshitij 2011-10-18 03:06:05

2 réponses

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 voulez le délier dans certains modules. Tout d'abord, vous pouvez envisager de changer votre héritage POM de sorte 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 faire cela, alors vous pouvez définir explicitement la phase d'exécution à "rien" dans un module enfant. Par exemple: si vous aviez une configuration parent pom 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>

alors 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>

parce que c'est le même plugin et le même id d'exécution, il supplante la configuration spécifiée dans le parent, et maintenant le plugin n'est pas lié à une phase dans le projet enfant.

64
répondu Ryan Stewart 2011-10-17 23:20:18

la réponse de Ryan Stewart fonctionne si l'exécution que vous souhaitez supprimer dans la pom parent est marquée d'un id . Si, cependant, le parent pom ne marque pas l'exécution avec un id (et, bien sûr, vous ne pouvez pas éditer ce parent pom) alors j'ai trouvé que faire ce qui suit supprime l'action du parent pom.

  1. première mise en phase de l'exécution à none
  2. créer une autre exécution, lui donner un id et faire ce que vous avez besoin de faire.
  3. exécuter mvn help:effective-pom pour confirmer qu'elle est correctement supprimé ce que vous avez besoin supprimée à partir du pom parent.

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

    <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 à jar-no-fork . Notez que l'exécution dans la pom mère n'a pas de id que je pourrais utiliser pour la désactiver. Alors, voici ce que ajouté à mon nom d'enfant:

            <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 efficace-pom:

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

cela a assuré que l'objectif jar ne court jamais et seul l'objectif jar-no-fork exécute-ce qui est ce que je voulais atteindre.

1
répondu Alok Lal 2017-08-14 23:33:45