2009-07-11 18 views
228

Possiedo un progetto Maven multi-modulo con un progetto padre P e tre sottomoduli A, B e C. Sia B e C sono progetti di guerra ed entrambi dipendono da A.Moduli Maven + Creazione di un singolo modulo specifico

Posso digitare mvn compile in P e avere tutti i sottomoduli correttamente compilati. Il problema arriva quando voglio fare operazioni per moduli specifici.

Mi piacerebbe essere in grado di confezionare una guerra per il progetto B, ma quando faccio funzionare l'ordine pacchetto dalla directory B s', si lamenta che non riesce a trovare le dipendenze per A.

Ho capito da questa domanda: Maven and dependent modules che forse Maven non è veramente progettato per questo tipo di risoluzione delle dipendenze, ma questo solleva la domanda su come posso impacchettare B?

  1. Devo correre mvn package per l'intera gerarchia del progetto quando ho davvero voglia B?

  2. Devo installare istantanee di A nel mio repository locale ogni volta che voglio pacchettizzare B?

Questo secondo scenario non è molto divertente quando A è ancora in fase di sviluppo.

Tutte le migliori pratiche qui?

+0

possibile duplicato di [Maven e moduli dipendenti] (http://stackoverflow.com/questions/808516/maven-and -dipendenti-moduli) – oberlies

risposta

448

Tutte le migliori pratiche qui?

Utilizzare il Maven advanced reactor options, più precisamente:

-pl, --projects 
     Build specified reactor projects instead of all projects 
-am, --also-make 
     If project list is specified, also build projects required by the list 

Quindi, solo cd nella directory P genitore ed eseguire:

mvn install -pl B -am 

E questo costruirà B ed i moduli richiesti da B

+12

Per chiunque abbia colpito questa pagina nel 2011, questa è la risposta migliore. Ora c'è un supporto migliore per i multi-moduli all'interno di maven stesso (Maven 2.1 e successivi), non è necessario utilizzare il plug-in del reattore. – Spedge

+14

Un'altra opzione molto utile è "-amd, --also-make-dependents", che crea tutti i moduli dipendenti dai progetti nell'elenco dei reattori – deterb

+0

Che ne è della creazione di un modulo di nipote? – Bax

6

Se in precedenza è stato eseguito mvn install sul progetto B, sarà stato installato nel repository locale, quindi quando si crea il pacchetto A Maven può risolvere la dipendenza. Quindi, se installi il progetto B ogni volta che lo cambi, le tue build per il progetto A saranno aggiornate.

È possibile definire un progetto a più moduli con un aggregatore per creare una serie di progetti.

Vale anche la pena menzionare m2eclipse, integra Maven in Eclipse e consente di (facoltativamente) risolvere le dipendenze dallo spazio di lavoro. Pertanto, se si sta effettuando l'hacking su più progetti, il contenuto dell'area di lavoro verrà utilizzato per la compilazione. Una volta che sei soddisfatto delle tue modifiche, esegui mvn install (su ogni progetto a turno o usando un aggregatore) per inserirle nel tuo repository locale.

+1

Esiste un modo semplice per garantire che tutti i progetti dipendenti per il mio progetto di destinazione siano stati installati? La gerarchia che ho è in realtà molto più complessa di quella qui descritta, quindi prova a ricordare se ho eseguito l'installazione di mvn per ogni progetto dipendente da quando ho apportato le modifiche del codice potrebbe essere difficile. –

+0

Sì, utilizzando i moduli per creare l'insieme di progetti, vedere il collegamento aggiunto alla risposta originale. –

+0

404 errore o il tuo link di progetto multi-modulo. –

7

Maven è stato progettato per questo tipo di dipendenza.

mvn package non installa nulla nel repository locale, ma solo pacchetti il ​​progetto e lo lascia nella cartella di destinazione.

Do mvn install nel progetto padre (A), con questo tutti i sottomoduli verranno installati nel repository Maven del computer, se non ci sono modifiche è sufficiente compilare/impacchettare il sottomodulo (B) e Maven prenderà le dipendenze già compresse e installate giusto.

Hai appena bisogno di un mvn install nel progetto padre se hai aggiornato una parte del codice.

+2

Sarebbe un incubo durante lo sviluppo, immagine che una volta eseguita una correzione nel sottomodulo, la si installerà e quindi si avvierà il contenitore servlet. La vita è breve :( – hguser

2

Hai detto che "vuoi solo B", ma questo è falso. Vuoi B, ma vuoi anche un A aggiornato se ci sono state delle modifiche ("sviluppo attivo").

Quindi, a volte si desidera lavorare con A, B e C. In questo caso si ha il progetto di aggregatore P. Per il caso in cui si desidera lavorare con A e B (ma non si desidera desidera C), è necessario creare aggregatore progetto D.

Edit 2016: le informazioni di cui sopra è stato forse rilevante nel 2009. a partire dal 2016, mi raccomando ignorare questo nella maggior parte dei casi, e semplicemente utilizzando i -am o -pl bandiere della riga di comando come descritto nella risposta accettata. Se stai usando una versione di Maven dalla prima versione 2.1, cambia prima :)

+0

Grmphh ... poi finirò con tanti progetti di aggregatori come progetti – Kris

+0

@Kris Non lo consiglierei più. Lo lascerò qui nel caso qualcuno voglia ancora sapere come, ma Io uso sempre le bandiere -am e -pl ora ho aggiornato la mia risposta –

5

Dai un'occhiata alla mia risposta Maven and dependent modules.

Il Maven Reactor plugin è progettato per gestire parte di un progetto.

L'obiettivo in particolare lo si desidera utilizzare reactor:make.

+2

Questa era la risposta giusta, ma con Maven 2.1 non hai più bisogno di usare il plugin del reattore Guarda la risposta di Pascal in questa discussione "Advanced Reactor Options" – Spedge

Problemi correlati