2009-10-26 7 views
52

In un progetto a più moduli, come è possibile specificare che si desidera eseguire un obiettivo di plug-in in tutti i moduli figlio, ma non nel progetto principale? C'è <pluginManagement>, ma che definisce solo la configurazione per l'esecuzione - i moduli bambino avrebbe ancora bisogno di fare riferimento al plugin per ottenere l'obiettivo eseguito:Esegui l'obiettivo del plug-in Maven sui moduli figlio, ma non sul genitore

[...] Tuttavia, questo configura solo i plugin che sono effettivamente fatto riferimento all'interno dell'elemento plugins nei bambini. (POM Reference)

Qualsiasi altro modo per raggiungere questo obiettivo?

UPDATE: Ho provato questo secondo il consiglio di Pascal:

<!-- ... --> 
<packaging>pom</packaging> 
<modules> 
    <module>child</module> 
</modules> 

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
<!-- ... --> 

Questo sarà ancora generare un .jar per il progetto principale, anche se l'obiettivo jar è legato alla fase integration-test.

+1

non puoi semplicemente associarlo a una fase che non è eseguito in un progetto di pom-tipo (che un genitore dovrebbe essere ?) – falstro

+0

@roe Penso che il tuo commento potrebbe essere rivolto a una risposta :-) Mi piacerebbe saperlo, e voterei a favore ;-) – KLE

+0

@KLE Non era una risposta, stavo cercando di aiutare il brainstorming. Non ho idea di come farlo davvero. – falstro

risposta

23

Secondo il Default Lifecycle Bindings, le associazioni per una confezione pom sono:

predefinito Lifecycle Attacchi - Packaging pom

 
package  site:attach-descriptor 
install  install:install 
deploy  deploy:deploy 

Così, se il POM genitore ha un <packaging>pom<packaging> (questo dovrebbe essere il caso come indicato in un commento) e se ci si lega i tuoi plug-in su altre fasi oltre a quelle sopra (vedi lo Lifecycle Reference per un elenco completo), non verranno eseguiti durante la generazione del POM padre.

(EDIT: La mia risposta iniziale è solo sbagliato Se si associa un obiettivo plugin per una particolare fase, verrà attivato e durante quella fase, indipendentemente dal confezionamento del progetto Il Default Lifecycle Bindings non hanno nulla.. Tutto ciò che conta è se la fase a cui il plugin è associato fa parte del build lifecyle.)

Come si è fatto notare, è possibile utilizzare il pluginManagement nel genitore principale per la configurazione del plugin ma se si vuole veramente eseguire un obiettivo plugin nei moduli figli e non nel genitore (si potrebbero avere buoni motivi per farlo questo ma la maggior parte del tempo, i plugin non avranno molto effetto su un modulo con una confezione pom che non ha alcun contenuto), dovrete fare riferimento ai plugin nell'elemento plugins nei bambini.

applicato al tuo esempio, il pom.xml genitore potrebbe definire le seguenti specifiche:

<project> 
    <packaging>pom</packaging> 
    ... 
    <modules> 
    <module>child</module> 
    </modules> 
    ... 
    <build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
      <execution> 
       <id>my-execution-id</id> 
       <phase>integration-test</phase> 
       <goals> 
       <goal>jar</goal> 
       </goals> 
      </execution> 
      </executions> 
     </plugin> 
     ... 
     </plugins> 
    </pluginManagement> 
    </build> 
    ... 
</project> 

E in ogni bambino pom.xml, soltanto è richiesta la seguente:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     </plugin> 
    </plugins> 
    ... 
    </build> 
</project> 
+1

La risposta di Pascal è corretta. Nella sezione padre '' principale definisce conifugration per i plugin ma non impone le loro esecuzioni, è necessario inserire anche la '' 'sezione per diffondere le ecc. Di questi plugin in moduli figlio. – cetnar

+0

Ho provato questo con 'maven-jar-plugin', ma crea ancora un .jar per il mio progetto POM padre. Aggiungerò i dettagli alla domanda. –

+0

Grazie, ha funzionato per me. –

15

La soluzione descritta con la gestione dei plugin è sicuramente corretta, ma in alcuni casi non è adatta.Si supponga di voler eseguire diversi jar: goal jar nel modulo figlio, ciascuno configurato con le proprie impostazioni (configurazione) per esecuzione. O in generale, quando non vuoi forzare i poms dei bambini a far scattare esplicitamente il/i plugin/i.

In questo caso la soluzione che ha funzionato per me è stato quello di definire le esecuzioni nel pom genitore sotto un profilo specifico, e l'abbiano attivata solo in pon bambino, ad esempio controllando per l'esistenza di un certo file o di proprietà:

<profile> 
    <id>generate-dc</id> 
    <activation> 
     <file> 
      <exists>src/main/assembly/some.xml</exists> 
     </file> 
    </activation> 

Quindi i plug-in non verranno eseguiti nel genitore, ma saranno eseguiti in tutti i bambini se questi contengono il file o impostano alcune proprietà.

+0

Questo non è certo carino, ma è l'unico lavoro che ho trovato per farlo. Suggerirei, tuttavia, di utilizzare una proprietà di ambiente come $ {project.name} o $ {pom.name} per attivare l'attivazione anziché il file, ma è, ovviamente, caso per caso. – Miquel

+0

Ha, questo suggerimento mi ha portato all'unica soluzione per i segmenti Maven mescolati "composti". Crea file di selezione profilo vuoti. È terribile ma potrebbe essere peggio. – Reinderien

+1

Ottima soluzione per l'esecuzione condizionata di plug-in, mi ha salvato la giornata! –

8

Avevo un requisito simile per eseguire alcuni plug-in nel figlio ma non il padre POM. ho raggiunto questo affermando <skip>true</skip> nel POM padre.

La voce pom genitore è qui sotto: ingresso pom

<plugin> 
    <groupId>eviware</groupId> 
    <artifactId>maven-soapui-plugin</artifactId> 
    <version>4.0.0</version> 
    <inherited>false</inherited> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <skip>true</skip> 
    </configuration> 
</plugin> 

Il progetto bambino è sotto

<plugins> 
    <plugin> 
     <groupId>eviware</groupId> 
     <artifactId>maven-soapui-plugin</artifactId> 
     <version>4.0.0</version> 
     <configuration> 
      <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile> 
      <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile> 
      <outputFolder>site-service-web/target/surefire-reports</outputFolder> 
      <junitReport>true</junitReport> 
      <exportwAll>true</exportwAll> 
      <printReport>true</printReport> 
     </configuration> 
    </plugin> 
</plugins> 
+0

Attenzione l'impostazione sopra potrebbe funzionare ma in casi complessi in cui altri pom ereditano il genitore e in particolare il plugin che è stato definito come skip true, si verificherà un problema poiché il plugin NON verrà eseguito, a meno che non lo definisca o lo configuri . Per i plug-in usati raramente si desidera qualche problema, ma per plugin come maven-resources-plugin il salto predefinito true potrebbe essere un problema – javapapo

+0

Questo ha funzionato per me. Anche se il plug-in che dovevo usare - appassembler - non salta davvero, ho solo messo una configurazione segnaposto nel POM di primo livello e i miei moduli figlio hanno iniziato a eseguire correttamente l'obiettivo di appassembler. Grazie! :) –

0

ho cercato la risposta da Pascal, ma non ha funzionato per me. I plug-in referenziati nel child pom non sono stati eseguiti, presumo perché non avevano un binding di fase build.

Il post qui descrive una soluzione che agisce legandosi plugin agli ID di esecuzione e costruire fasi: How to override default binding to phase of a Maven plugin

Mi raccomando che a chiunque altro cercando di ottenere questo lavoro.

0

Utilizzare <inherited>false</inherited> nella sezione plugins del progetto principale.

Fare riferimento a this page per ulteriori informazioni.

0

Questa configurazione di seguito ha funzionato per me. Aggiungi il plugin sia nel genitore che nel figlio.

principale:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>true</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>true</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

Bambino

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>false</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>false</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
Problemi correlati