Aggiornamento dei numeri di versione dei moduli in un progetto Maven multi-modulo


325

Ho un progetto maven multi-modulo. Intendiamo mettere insieme tutti questi moduli. Ma per ora sto finendo la versione hard-coding in ciascuno dei moduli pom.xml come di seguito

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

e il modulo principale principale ha la seguente configurazione

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
La tua domanda è errata e confonde le persone che hanno veri POM multi-modulo ("aggregati"). Dal tuo esempio e dalle risposte sembra che tu stia davvero parlando di un POM genitore, non di un POM aggregato multi-modulo. Vedi maven.apache.org/pom.html#Aggregation .
Garret Wilson,

Risposte:


631

Utilizzare versions:setdal plug-in versioni-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Adatterà tutte le versioni di pom, le versioni parent e le versioni di dipendenza in un progetto multi-modulo.

Se hai fatto un errore, fallo

mvn versions:revert

successivamente, o

mvn versions:commit

se sei soddisfatto dei risultati.


Nota: questa soluzione presuppone che tutti i moduli utilizzino anche il pom aggregato come pom principale, uno scenario che era considerato standard al momento di questa risposta. In caso contrario, cerca la risposta di Garret Wilson .


5
Sarebbe bello se ci fosse una soluzione che non richiede di cambiare effettivamente ciascun modulo. L'unica alternativa che mi viene in mente è quella di utilizzare sempre una versione di snapshot per il genitore-pom.
Amanic,

54
Inoltre, è versions:setpossibile specificare -DgenerateBackupPoms=false, come impostazione predefinita, questo plug-in esegue il backup dei file pom originali.
Maksim Sorokin,

20
Questo è il punto versions:commit: "Rimuove il backup iniziale del pom, accettando così le modifiche".
Michael Laffargue,

2
Un nuovo plug-in risolve il problema descritto in questa domanda in modo diverso: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan,

1
@MichaelLaffargue versioni mvn: commit sembra rimuovere i file di backup generati dal precedente pom.xml
Cris Rockwell

58

La risposta data presuppone che il progetto in questione usi l'ereditarietà del progetto oltre all'aggregazione dei moduli. In realtà quelli sono concetti distinti:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

Alcuni progetti possono essere un'aggregazione di moduli, ma non avere una relazione padre-figlio tra aggregatore POM e moduli aggregati. (Potrebbe non esserci alcuna relazione genitore-figlio, oppure i moduli figlio possono utilizzare del tutto un POM separato come "genitore"). In queste situazioni la risposta fornita non funzionerà.

Dopo molta lettura e sperimentazione, si scopre che esiste un modo per utilizzare il plug-in Maven Versions per aggiornare non solo l'aggregatore POM ma anche tutti i moduli aggregati; è l' processAllModulesopzione. Il seguente comando deve essere eseguito nella directory del progetto aggregatore:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

Il plug-in Maven di versioni non aggiornerà solo le versioni di tutti i moduli contenuti, ma aggiornerà anche le dipendenze tra i moduli !!!! Questa è una grande vittoria e farà risparmiare molto tempo e previene ogni tipo di problema.

Naturalmente non dimenticare di confermare le modifiche in tutti i moduli, cosa che puoi fare anche con lo stesso switch:

mvn versions:commit -DprocessAllModules

Puoi decidere di rinunciare del tutto al backup POMS e fare tutto in un solo comando:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

Come automatizziamo la prossima versione così come il plugin build-helper?
lostintranslation

Utilizzando Maven 3.5.0 non riesco a farlo funzionare. Ho l'aggregazione del progetto e solo il padre principale è stato aggiornato. Ho anche provato l'ereditarietà del progetto (insieme all'aggregazione - "tutte e tre le regole" dal link fornito), e di nuovo solo il pom padre è stato aggiornato.
SiKing

1
Ho trovato lo switch make-it-work segreto: la versione iniziale del pom padre e dei moduli deve essere la stessa! Il mio genitore pom stava iniziando con "1-SNAPSHOT" e i moduli avevano "1.0.0-SNAPSHOT". :)
SiKing

1
Con un progetto aggregatore, la versione dell'aggregatore e le versioni dei sottomoduli non devono essere le stesse. (Ad esempio il tuo aggregatore pom può cambiare solo raramente e può rimanere in una particolare versione, mentre i singoli sottomoduli possono avere i propri cicli di rilascio). La proprietà chiave da specificare per il versions:setplugin è -DoldVersion='*', su mojohaus.org/versions-maven-plugin/set-mojo.html , dice esplicitamente che questa proprietà deve essere specificata durante l'elaborazione di un progetto aggregatore.
Matthew Wise,

2
In quali condizioni funziona -DprocessAllModulesdavvero? Non funziona per me.
Alex R,

24

Se vuoi automatizzare completamente il processo (ovvero vuoi incrementare il numero di versione senza sapere quale sia il numero di versione corrente), puoi farlo:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
Grazie, @Crummy, mi hai salvato la giornata
Maksim Kostromin,


Oppure puoi usare-DoldVersion='*'
Matthew Wise

23

Potresti voler esaminare la versione del plugin di rilascio di Maven : obiettivo di aggiornamento-versioni . Aggiornerà la versione del genitore e tutti i moduli sottostanti.


Aggiornamento: si noti che quanto sopra è il plugin di rilascio. Se non stai rilasciando, potresti voler usareversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
Versione mvn: set non influenza i moduli.
9ilsdx 9rvj 0lo,


OK lo fa quando la build del reattore è nello stesso momento genitore. È confuso quando la struttura sembra diversamente ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesha funzionato bene per me, anche se non sto rilasciando :-)
msa

11

Vi incoraggio a leggere il Maven Book sulle build multi-modulo (reattore).

Intendevo in particolare quanto segue:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

dovrebbe essere cambiato in. Qui prenditi cura della versione non definita solo nella parte padre che è definita.

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

Questo è un collegamento migliore .


10
e cercare cosa nello specifico?
Thorbjørn Ravn Andersen,

2
+1 per la corretta formattazione dei pom.xmlfile, ma sono d'accordo (con @ ThorbjørnRavnAndersen) che leggere un intero libro per queste informazioni è eccessivo. : p
Priidu Neemre,

7
Sfortunatamente, ereditare le informazioni sulla versione dal genitore non rimuove l'onere di dover modificare tutti i file pom nel progetto, perché fanno tutti riferimento al genitore in base al numero di versione .
Steven the Easy Amused

1
Potresti usare le versioni-maven-plugin che gestisce tutta questa roba o puoi usare il maven-release-plugin e quindi non è necessario gestirlo manualmente ...
khmarbaise,

5

versions:update-child-modulessuona come quello che stai cercando. Potresti fare versioni: imposta come detto, ma questo è un modo leggero per aggiornare i numeri di versione padre. Per i moduli figlio, è mia opinione che dovresti rimuovere le <version>definizioni, poiché erediteranno il numero di versione del modulo genitore.


3

Il modo migliore è, dal momento che si intende raggruppare i moduli insieme, è possibile specificare il <dependencyManagement>tag nella maggior parte esterna pom.xml(modulo principale) direttamente sotto il <project>tag. Controlla la versione e il nome del gruppo. Nel tuo modulo individuale, devi solo specificare il <artifactId>tag nel tuo pom.xml. Prenderà la versione dal file principale.


Non riesco a trovare il tag dependencyManagement su pom.xml . Stai pensando a qualcos'altro ?
ArturoTena,

0

il modo più semplice è cambiare la versione di ogni pom.xml in versione arbitraria. quindi controlla quella gestione delle dipendenze per usare la versione corretta del modulo usato in questo modulo! ad esempio, se si desidera aumentare il versioning per un progetto del modulo di rimorchio, è necessario eseguire il flusso:

nel modulo bambino:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

e nel modulo genitore:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

0

Per aggiornare pom.xml principale e la versione principale sui sottomoduli:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
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.