2011-01-13 13 views
27

Ho bisogno di modificare la build di maven per un progetto di grandi dimensioni per saltare determinati passaggi durante le tipiche build di sviluppo (ad esempio, non creare i file * -source.jar). Ho cercato "esecuzione condizionale" per Maven, ma non ho trovato nulla.Uso dei profili maven per controllare l'esecuzione di build

Un profilo dev suona come il modo intuitivo per farlo - ma non so quanto sia intuitivo il maven. I documenti per i profili mostrano come impostare diverse proprietà (ad esempio i parametri di connessione al database) per diversi profili. Suppongo di poter impostare una proprietà e quindi verificare se tale proprietà è impostata nel codice di esecuzione di maven-source-plugin - executions - execution.

È questo il modo giusto per eseguire un'esecuzione condizionale in Maven?

Qual è il modo "giusto" per farlo in Maven?

risposta

33

Stai pensando un po 'indietro: avere il profilo abilitare il comportamento, non disattivarlo. Questo è proprio ciò che i profili sono i migliori, ed è esattamente il tuo caso: vuoi solo i passaggi da eseguire in determinate circostanze. Così si potrebbe avere qualcosa di simile:

<profile> 
    <id>source-jars</id> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 

E in effetti c'è un esempio proprio come questo sul maven-source-plugin usage page. Quando hai bisogno di generare il tuo artefatto, usa mvn -P source-jars (o qualsiasi altra cosa). Questo è tutto! Se hai solo bisogno di farlo al momento del rilascio, lo release plugin offre persino un modo per definire i profili da usare direttamente nella configurazione del plugin di rilascio.

+0

I nostri poms sono scritti dove maven-source-plugin viene eseguito di default, quindi dovrò ristrutturarli come suggerito. –

+3

Esistono molti casi in cui è consigliabile attivare i plugin per impostazione predefinita e disattivati ​​utilizzando un profilo. Penso che questa risposta eviti il ​​problema senza risolverlo. – Kevin

+1

@Mowgli Ma il sistema di profili maven non è adatto a questo: c'è solo un meccanismo di "attivazione", non un meccanismo di "disattivazione". Alcuni plugin gestiscono questo creando un proprio meccanismo di disattivazione (ad esempio, skipTests per il plugin surefire). –

6

È possibile raggiungere il proprio obiettivo effettivo di abilitare il plug-in sorgente-jar per impostazione predefinita aggiungendo due profili al POM. Le Maven profiles documentation note che è possibile aggiungere un elemento <activeByDefault>true</activeByDefault> alla sezione activation e afferma che

Questo profilo sarà automaticamente attivo per tutte le build meno che un altro profilo nella stessa POM si attiva utilizzando uno dei metodi descritti in precedenza

Quindi, è possibile aggiungere due profili, uno dei quali è activeByDefault, che include il relativo plug-in e un altro, che può essere attivato in uno dei modi standard (come -P dalla riga di comando) per impedire il default profilo dalla corsa. La sezione profiles nei tuoi pom.xml (o impostazioni Maven o qualsiasi altra cosa) potrebbe quindi apparire come segue:

<profile> 
    <id>source-jars</id> 
    <activation> 
    <activeByDefault>true</activeByDefault> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 
     </plugin> 
    </plugins> 
    </build> 
</profile> 
<profile> 
    <!-- active this profile to disable the source-jars plugin --> 
    <id>no-optional-plugins</id> 
</profile> 

Purtroppo, non riesco a vedere un modo per rendere questo metodo scala bene per il controllo di più plugin - Penso che è necessario O(n^2) profili per i plugin n, ma per questo semplice caso dovrebbe funzionare correttamente.

Un'altra opzione possibilmente più semplice con Maven ≥ 2.0.10 è quello di avere solo il profilo source-jars dall'alto (ancora activeByDefault), e per manually deactivate the profile quando si desidera anteponendo l'ID del profilo con - o ! dopo la bandiera -P CLI:

Questo metodo non ha lo stesso O(n^2) problemi con più plug-in ma è anche meno flessibile, poiché la disattivazione non può essere attivata da una proprietà di sistema, una variabile di ambiente, una versione JDK ecc.

+0

grazie, questo esempio che mi hai fornito mi ha davvero aiutato – Hoto