Attiva automaticamente il plug-in principale in Maven
-
20-08-2019 - |
Domanda
È possibile avere un plugin definito nel POM genitore che è disattivato e quando il figlio eredita questo plugin viene attivato automaticamente?
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.