Domanda

È possibile avere un plugin definito nel POM genitore che è disattivato e quando il figlio eredita questo plugin viene attivato automaticamente?

È stato utile?

Soluzione

Immagino che tu voglia configurare il plugin nel tuo pom genitore, ma usarlo solo nei progetti ereditati.Maven ha una sezione per questo: configura i tuoi plugin in pluginManagement, ma collegali a una fase proprio quando ne hai bisogno, ad es.ometti il ​​tag fase in pluginManagement, ma specificalo in pom.

Altri suggerimenti

Quindi 'siddhadev' è esattamente corretto. È possibile definire la configurazione del plug-in nel pom principale con un determinato ID:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>child-caller</id>
                        <!-- 'phase' omitted -->
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo message="called from child!" />
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

E, nel POM figlio, puoi elencare esplicitamente la fase in cui questo dovrebbe essere chiamato:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>child-caller</id>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

L'ho usato per colpire vari JRE. Sfortunatamente, poiché non è possibile utilizzare il plug-in del compilatore maven con diverse directory di destinazione (che considero un bug nel plug-in), è necessario utilizzare Ant.

Questo non è esattamente ciò che stai cercando, ma penso che funzionerà abbastanza bene per te.

Se dichiari il plugin in un tag pluginManagement nel padre, la configurazione sarà ereditata da tutti i progetti figlio che dichiarano quel plugin.

Ad esempio, nel genitore dichiarare che il plug-in di compilazione utilizza Java 5 per la compilazione di test.

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>test-compile</id>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</pluginManagement>

Quindi, in un bambino, dichiari semplicemente il plug-in del compilatore e la configurazione dal genitore verrà ereditata:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
    </plugin>
  </plugins>
</build>

Puoi dichiarare un plugin al livello più alto pom e dire che deve essere ignorato e quindi dire che non deve essere ignorato a livello figlio. Non è del tutto automatico, ma molto minimale nella verbosità di override.

Parent Pom, disabilitando il plugin, ma dichiarando tutta la configurazione:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>true</skip>
        ...lots more config...
        ...lots more config...
        ...lots more config...
    </configuration>
</plugin>

Child Pom, abilitando il plugin:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>false</skip>
    </configuration>
</plugin>

Sono andato con la seguente soluzione:

  • Configura il plugin nel parent-pom nella sezione pluginManagement. Associa il plug-in a una fase esistente.

  • Disattiva il plug-in per il parent-pom vincolandolo a una fase inesistente: sovrascrivi la fase nella sezione plug-in.

  • Attiva il plugin in ogni figlio-figlio includendo il plugin nella sezione plugin.

Esempio parent-pom:

<defaultGoal>install</defaultGoal>
    <pluginManagement>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>install</phase>
                        <goals>
                        <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <file>${ejb-client-file}</file>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${project.artifactId}</artifactId>
                            <version>${project.version}</version>
                            <packaging>jar</packaging>
                            <classifier>client</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
                    ...                 
        </plugins>
    </pluginManagement>
    <plugins>
            <plugin>
                <!-- deactivate the plugin for this project, only child-projects do generate ejb-clients -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <inherited>false</inherited>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
            ...
    </plugins>
</build>

Esempio child-pom:

<build>
    <plugins>
            ...
        <plugin>
            <!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
        </plugin>       
            ... 
    </plugins>
</build>

Per quanto ne so, non esiste una soluzione generica per questo. Almeno per il momento ...

Un'idea (non l'ho provato, ma potrebbe funzionare) è quella di definire, nel genitore pom.xml, un obiettivo di esecuzione che non esiste, ad esempio:

<executions>
    <execution>
        <goals>
            <goal>noGoal</goal>
        </goals>
    </execution>
</executions>

e in ogni bambino ridefinisci un obiettivo corretto.

Il problema di questa soluzione (se funziona, ovviamente;)) è che devi ridefinire la configurazione del plugin per ogni bambino. Altrimenti, non verrà eseguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top