Moduli Maven + Creazione di un singolo modulo specifico


384

Ho un progetto Maven multi-modulo con un progetto principale Pe tre sotto-moduli A, Be C. Entrambi Be Csono progetti di guerra ed entrambi dipendono da A.

Posso tipo mvn compilein Pe hanno tutti i sotto-moduli correttamente compilati. Il problema si presenta quando voglio fare operazioni per moduli specifici.

Mi piacerebbe essere in grado di creare un pacchetto di una guerra per progetto B, ma quando eseguo il comando pacchetto dalla Bdirectory di, si lamenta che non riesce a trovare le dipendenze per A.

Capisco da questa domanda: Maven e moduli dipendenti che forse Maven non è davvero progettato per questo tipo di risoluzione delle dipendenze, ma ciò pone la domanda su come impacchettare B?

  1. Devo correre mvn packageper l'intera gerarchia del progetto quando voglio davvero B?

  2. Devo installare le istantanee di A nel mio repository locale ogni volta che voglio creare un pacchetto B?

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

Qualche best practice qui?


possibile duplicato di Maven e moduli dipendenti
oberlies

Risposte:


696

Qualche best practice qui?

Utilizzare le opzioni avanzate del reattore Maven , in particolare:

-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 basta cdentrare nella directory P principale ed eseguire:

mvn install -pl B -am

E questo costruirà B e i moduli richiesti da B.

Si noti che è necessario utilizzare i due punti se si fa riferimento a un artifactIddiverso dal nome della directory:

mvn install -pl :B -am

Come descritto qui: https://stackoverflow.com/a/26439938/480894


15
Per chiunque colpisca questa pagina nel 2011, questa è la risposta migliore. Ora c'è un supporto migliore per i multi-moduli all'interno di Maven (Maven 2.1 e versioni successive), non è necessario utilizzare il plug-in del reattore.
Spedge,

17
Un'altra opzione molto utile è "-amd, - anche-make-dependents", che costruisce tutti i moduli dipendenti dai progetti nell'elenco dei reattori.
deterb

1
Che ne dici di costruire un modulo per nipoti?
Bax,

12
@Bax, usa la mvn install -pl .,parent/child,parent/child/grandchild virgola per separare più progetti e. per genitore
Neo

1
Quando provo clean packageun modulo in questo modo, non è possibile risolvere le dipendenze del reattore che non sono ancora state installate. Con -amesso ricostruirà inutilmente i deps.
Bacino

18

Di 'Parent pom.xml contiene 6 moduli e si desidera eseguire A , B e F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd nel progetto genitore

 mvn --projects A,B,F --also-make clean install

O

mvn -pl A,B,F -am clean install

O

mvn -pl A,B,F -amd clean install

Nota: quando si specifica un progetto con -am opzione , Maven costruirà tutti i progetti da cui dipende il progetto specificato (direttamente o indirettamente). Maven esaminerà l'elenco dei progetti e percorrerà l'albero delle dipendenze, trovando tutti i progetti che deve costruire.

Mentre il comando -am rende tutti i progetti richiesti da un particolare progetto in una build multi-modulo, l' opzione -amd o --also-make-dependents configura Maven per costruire un progetto e qualsiasi progetto che dipende da quel progetto. Quando usa - anche-make-dependents , Maven esaminerà tutti i progetti nel nostro reattore per trovare progetti che dipendono da un particolare progetto. Costruirà automaticamente quei progetti e nient'altro.


8

Maven è stato progettato per questo tipo di dipendenza.

mvn package non installerà nulla nel repository locale, impacchetterà semplicemente il progetto e lo lascerà nella cartella di destinazione.

Fare mvn install nel progetto padre (A), con questo tutti i sottomoduli saranno installati nel repository Maven del tuo computer, se non ci sono cambiamenti devi solo compilare / impacchettare il sottomodulo (B) e Maven prenderà il già impacchettato e dipendenze installate giuste.

Devi solo mvn installinserire nel progetto principale se hai aggiornato una parte del codice.


3
Sarebbe un incubo durante lo sviluppo, immagine che una volta effettuata una correzione nel sottomodulo, sarà necessario installarlo e quindi avviare il contenitore servlet. La vita è breve :(
hguser

7

Se hai già eseguito mvn install sul progetto B, questo sarà stato installato nel tuo repository locale, quindi quando compili il pacchetto A Maven può risolvere la dipendenza. Quindi, purché si installi il progetto B ogni volta che lo si modifica, le build per il progetto A saranno aggiornate.

È possibile definire un progetto multi-modulo con un aggregatore pom 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. Quindi, se stai hackerando 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 sua volta, o usando un aggregatore) per metterle nel tuo repository locale.


1
C'è un modo semplice per garantire che tutti i progetti dipendenti per il mio progetto target siano stati installati? La gerarchia che ho in realtà è molto più complessa di quella descritta qui, quindi prova a ricordare se ho eseguito mvn install per ciascun progetto dipendente dall'ultima volta che ho apportato modifiche al codice potrebbe essere complicato.
Brian Ferris,

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

5

Dai un'occhiata alla mia risposta Maven e ai moduli dipendenti .

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

L'obiettivo particolare che vorrai utilizzarlo reactor:make.


3
Questa era la risposta giusta, ma con Maven 2.1 non è più necessario utilizzare il plug-in del reattore. Guarda la risposta di Pascal in questo thread riguardante "Advanced Reactor Options"
Spedge

3

Dici 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 vuoi lavorare con A, B e C. Per questo caso hai un progetto aggregatore P. Per il caso in cui vuoi lavorare con A e B (ma non vuoi C), dovresti creare un progetto aggregatore Q .

Modifica 2016 : le informazioni di cui sopra erano forse rilevanti nel 2009. A partire dal 2016, consiglio vivamente di ignorarle nella maggior parte dei casi e di utilizzare semplicemente i flag della riga di comando -amo -plcome descritto nella risposta accettata. Se stai usando una versione di Maven precedente alla v2.1, cambia prima :)


Grmphh ... poi finirò con tanti progetti aggregatori quanti progetti.
Kris,

@Kris Non lo consiglierei più. Lascio qui nel caso qualcuno voglia ancora sapere come, ma ora uso sempre i flag -am e -pl. Ho aggiornato la mia risposta.
Zac Thompson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.