2009-07-09 1 views
18

Ho visto this question e mi ha motivato a guardare di nuovo (senza successo) alle configurazioni di Maven per un modo alternativo di dichiarare la configurazione in modo che venga aggiunta alla configurazione del padre POM invece di sovrascriverla. In un POM Maven, se la configurazione dichiara gli stessi elementi del genitore, sovrascrive la configurazione dei genitori. Poiché la risposta accettata all'altra domanda dice, questo è il comportamento previsto.Aumento invece della configurazione Maven sovrascrivibile

Ma questo non è sempre il comportamento desiderato. Dovrebbe esserci/c'è un mezzo in Maven da aggiungere alla configurazione piuttosto che a scavalcare?

Ad esempio: - Fornire la capacità di dichiarare elementi della configurazione finale, in modo che i bambini possano aggiungerli ma non sostituirli? - Consentire la configurazione bambino di dichiarare elemento in aggiunta, per cui è fusa con il genitore


Un buon esempio di quando il comportamento di override non è sempre auspicabile è per l'elemento aspectLibraries del AspectJ-maven-plugin .

Nel mio POM padre definisco una configurazione per il plugin aspectj che dichiara un jar di traccia da utilizzare come un aspettoLibrary.

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <executions> 
    <execution> 
    <id>compile_with_aspectj</id> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <aspectLibraries> 
     <aspectLibrary> 
     <groupId>name.seller.rich</groupId> 
     <artifactId>tracing</artifactId> 
     </aspectLibrary> 
    </aspectLibraries> 
    </configuration> 
    <dependencies> 
    <dependency> 
     <groupId>aspectj</groupId> 
     <artifactId>aspectjtools</artifactId> 
     <version>1.5.3</version> 
    </dependency> 
    </dependencies> 
</plugin> 

Questo è ereditato da tutti i progetti figlio e ottengo traccia in tutti i progetti, il che è bello. Tuttavia, se definisco un altro aspetto di Library in un POM figlio, sostituisce la configurazione di tracciamento.

Nota Ho una soluzione a questo particolare problema, mi interessa il caso generale e le implicazioni per Maven.

La risposta semplice sarebbe quella di ridichiarare la configurazione per il jar di tracciamento nel POM figlio nonché il nuovo jar, ma questo ha implicazioni sulla manutenzione e se si desidera dichiarare la configurazione di traccia in un profilo in modo che possa essere disabilitato se necessario (cosa che faccio), ho quindi bisogno di reimplementare il profilo nel bambino.

La dichiarazione delle dipendenze nell'esempio precedente viene unita ad altre dichiarazioni di dipendenza nel genitore e altrove. So che le dipendenze sono un caso speciale, ma dimostra che è fattibile implementare.

risposta

21

Questo è stato spiegato in un blog post da Sonatype.

Nel pom genitore, specificare

<configuration> 
    <aspectLibraries combine.children="append"> 
    <aspectLibrary> 
     <groupId>name.seller.rich</groupId> 
     <artifactId>tracing</artifactId> 
    </aspectLibrary> 
    </aspectLibraries> 
</configuration> 

In generale, gli elementi di configurazione di bambini hanno la priorità su quelle specificate nel genitore per ogni plugin. Ciò mantiene le cose semplici per impostazione predefinita: un bambino completamente configurato userebbe esattamente la configurazione nel suo pom. Tuttavia, il genitore può imporre che gli elenchi debbano essere estesi anziché sostituiti utilizzando l'impostazione combine.children = "aggiungi" sugli elementi di configurazione desiderati.

+2

Grazie, è un grande aiuto Zac. Potrebbe essere utile chiarire la risposta per dimostrare che si tratta di una funzionalità generica su tutti gli elenchi di configurazione, non in particolare sulle librerie di aspetto –

+1

Aggiornamento come suggerito. Se questo comportamento cambia nelle future versioni di Maven, si spera che quelli che conoscono aggiorneranno le FAQ degli utenti esperti. –

1

Ho bisogno di testare così mi permetta di tornare a voi su questo, ma penso che il modo corretto per farlo è quello di utilizzare properties, come indicato here. Nel tuo caso il codice sarà il seguente:

<properties> 
    <aspect.library.groupId>name.seller.rich</aspect.library.groupId> 
    <aspect.library.artifactId>tracing</aspect.library.artifactId> 
</properties> 

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <executions> 
    <execution> 
    <id>compile_with_aspectj</id> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <aspectLibraries> 
     <aspectLibrary> 
     <groupId>${aspect.library.groupId}</groupId> 
     <artifactId>${aspect.library.artifactId}</artifactId> 
     </aspectLibrary> 
    </aspectLibraries> 
    </configuration> 
    <dependencies> 
    <dependency> 
     <groupId>aspectj</groupId> 
     <artifactId>aspectjtools</artifactId> 
     <version>1.5.3</version> 
    </dependency> 
    </dependencies> 
</plugin> 

Poi nel bambino si sarebbe in grado di modificare tali proprietà, e il genitore sarebbe automaticamente raccogliere i nuovi valori:

<properties> 
    <aspect.library.groupId>name.seller.rich</aspect.library.groupId> 
    <aspect.library.artifactId>something-else</aspect.library.artifactId> 
</properties> 

penso si potrebbe chiedere la possibilità di aggiungere la configurazione, tuttavia, in modo da avere un nodo aggiuntivo nella configurazione del figlio su quello specificato nel genitore. Per quel caso non riesco a pensare ad una soluzione ovvia.