Mise à jour des numéros de version des modules dans un projet Maven multi-modules

325

J'ai un projet maven multi-module. Nous avons l'intention de mettre à jour tous ces modules ensemble. Mais à partir de maintenant, je termine la version codée en dur dans chacun des modules pom.xml comme ci-dessous

<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>

et le module parent principal a la configuration ci-dessous

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
sandeepkunkunuru
la source
1
Votre question est inexacte et confond les gens qui ont de vrais POM multi-modules ("agrégés"). D'après votre exemple et les réponses, il semble que vous parliez vraiment d'un POM parent, et non d'un POM agrégé multi-modules. Voir maven.apache.org/pom.html#Aggregation .
Garret Wilson

Réponses:

631

Utilisation à versions:setpartir du plugin versions-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Il ajustera toutes les versions de pom, les versions parent et les versions de dépendance dans un projet multi-module.

Si vous avez fait une erreur, faites

mvn versions:revert

après, ou

mvn versions:commit

si vous êtes satisfait des résultats.


Remarque: cette solution suppose que tous les modules utilisent également le pom agrégé comme pom parent, un scénario qui était considéré comme standard au moment de cette réponse. Si ce n'est pas le cas, optez pour la réponse de Garret Wilson .

Sean Patrick Floyd
la source
5
Cela aurait été formidable s'il y avait une solution qui ne vous oblige pas à changer réellement chaque module. La seule alternative à laquelle je peux penser est de toujours utiliser une version snapshot pour le parent-pom.
AmanicA
54
En plus de versions:setcelui que vous pouvez spécifier -DgenerateBackupPoms=false, comme par défaut ce plugin sauvegarde les fichiers pom originaux.
Maksim Sorokin
20
C'est le point de la versions:commit: "Supprime la sauvegarde initiale du pom, acceptant ainsi les modifications."
Michael Laffargue
2
Un nouveau plugin résout le problème décrit dans cette question différemment: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan
1
@MichaelLaffargue mvn versions: commit semble supprimer les fichiers de sauvegarde générés du précédent pom.xml
Cris Rockwell
58

La réponse donnée suppose que le projet en question utilise l'héritage de projet en plus de l'agrégation de modules. En fait, ce sont des concepts distincts:

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

Certains projets peuvent être une agrégation de modules, mais n'ont pas de relation parent-enfant entre l'agrégateur POM et les modules agrégés. (Il peut n'y avoir aucune relation parent-enfant, ou les modules enfants peuvent utiliser un POM distinct en tant que "parent".) Dans ces situations, la réponse donnée ne fonctionnera pas.

Après beaucoup de lecture et d'expérimentation, il s'avère qu'il existe un moyen d'utiliser le plugin Versions Maven pour mettre à jour non seulement l'agrégateur POM mais aussi tous les modules agrégés; c'est l' processAllModulesoption. La commande suivante doit être effectuée dans le répertoire du projet agrégateur:

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

Le plugin Versions Maven ne mettra pas seulement à jour les versions de tous les modules contenus, il mettra également à jour les dépendances inter-modules !!!! C'est une victoire énorme et vous fera gagner beaucoup de temps et éviter toutes sortes de problèmes.

Bien sûr, n'oubliez pas de valider les modifications dans tous les modules, ce que vous pouvez également faire avec le même commutateur:

mvn versions:commit -DprocessAllModules

Vous pouvez décider de supprimer complètement les POMS de sauvegarde et de tout faire en une seule commande:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Garret Wilson
la source
Comment automatiser la prochaine version aussi bien que le plugin d'aide à la construction?
lostintranslation
En utilisant Maven 3.5.0, je ne peux pas faire fonctionner cela. J'ai l'agrégation de projets et seul le pom parent a été mis à jour. J'ai également essayé l'héritage du projet (avec l'agrégation - "les trois règles" du lien fourni), et encore une fois, seul le pom parent a été mis à jour.
SiKing
1
J'ai trouvé le secret du make-it-work: la version de départ du pom parent et les modules doivent être les mêmes! Mon pom parent commençait par "1-SNAPSHOT" et les modules avaient "1.0.0-SNAPSHOT". :)
SiKing
1
Avec un projet d'agrégateur, la version de l'agrégateur et les versions des sous-modules n'ont pas à être identiques. (Par exemple, votre pom d'agrégateur ne peut que rarement changer et peut rester dans une version particulière, tandis que les sous-modules individuels peuvent avoir leurs propres cycles de publication). La propriété clé à spécifier pour le versions:setplugin est -DoldVersion='*', sur mojohaus.org/versions-maven-plugin/set-mojo.html, elle indique explicitement que cette propriété doit être spécifiée lors du traitement d'un projet d'agrégateur.
Matthew Wise
2
Dans quelles conditions fonctionne -DprocessAllModulesréellement? Ça ne marche pas pour moi.
Alex R
24

Si vous souhaitez automatiser complètement le processus (c'est-à-dire que vous souhaitez incrémenter le numéro de version sans avoir à connaître le numéro de version actuel), vous pouvez le faire:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Malcolm Crum
la source
3
Merci, @Crummy, vous avez sauvé ma journée
Maksim Kostromin
Ou vous pouvez utiliser-DoldVersion='*'
Matthew Wise
23

Vous voudrez peut-être examiner la version du plug-in de sortie Maven : objectif de mise à jour des versions . Il mettra à jour la version du parent ainsi que tous les modules en dessous.


Mise à jour: Veuillez noter que ce qui précède est le plugin de publication. Si vous ne publiez pas, vous pouvez utiliserversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Nishant
la source
1
version mvn: set n'affecte pas les modules.
9ilsdx 9rvj 0lo
OK, c'est le cas lorsque la construction du réacteur est en même temps parent. C'est déroutant quand la structure semble différente ...
9ilsdx 9rvj 0lo
mvn release:update-versions -DautoVersionSubmodulesa bien fonctionné pour moi, même si je ne publie pas :-)
msa
11

Je vous encourage à lire le livre Maven sur les constructions multi-modules (réacteurs).

Je voulais dire en particulier ce qui suit:

<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>

devrait être changé en. Ici, faites attention à la version non définie uniquement dans la partie parent, elle est définie.

<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>

C'est un meilleur lien .

khmarbaise
la source
10
et chercher quoi spécifiquement?
Thorbjørn Ravn Andersen
2
+1 pour avoir mis en forme correctement les pom.xmlfichiers, mais je suis d'accord (avec @ ThorbjørnRavnAndersen) que la lecture d'un livre entier pour ces informations est exagérée. : p
Priidu Neemre
7
Malheureusement, hériter des informations de version du parent ne supprime pas la nécessité de modifier tous les fichiers pom du projet, car ils font tous référence au parent par numéro de version .
Steven the Easily Amused
1
Vous pouvez utiliser les versions-maven-plugin qui gère tout cela ou vous pouvez utiliser le maven-release-plugin et ainsi vous n'avez pas besoin de gérer cela manuellement ...
khmarbaise
5

versions:update-child-modulessonne comme ce que vous recherchez. Vous pouvez faire des versions: définissez comme mentionné, mais c'est un moyen léger de mettre à jour les numéros de version parent. Pour les modules enfants, je pense que vous devez supprimer les <version>définitions, car elles hériteront du numéro de version du module parent.

Jon Onstott
la source
3

La meilleure façon est, puisque vous avez l'intention de regrouper vos modules, vous pouvez spécifier la <dependencyManagement>balise dans la plupart externe pom.xml(module parent) directement sous la <project>balise. Il contrôle la version et le nom du groupe. Dans votre module individuel, il vous suffit de spécifier la <artifactId>balise dans votre pom.xml. Il prendra la version du fichier parent.

murali
la source
Je ne trouve pas la balise dependencyManagement sur pom.xml . Pensez-vous à autre chose ?
ArturoTena
0

la manière la plus simple est de changer la version de chaque pom.xml en version arbitraire. puis vérifiez cette gestion des dépendances pour utiliser la version correcte du module utilisé dans ce module! par exemple, si vous voulez augmenter le versioning pour un projet de module de remorquage, vous devez faire comme le flot:

dans le module childe:

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

et dans le module parent:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>
Mojtaba Mirakbari
la source
0

Pour mettre à jour le pom.xml principal et la version parent sur les sous-modules:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
angel.lopezrial
la source