Aktualisieren der Versionsnummern von Modulen in einem Maven-Projekt mit mehreren Modulen

322

Ich habe ein Maven-Projekt mit mehreren Modulen. Wir beabsichtigen, alle diese Module gemeinsam zu versionieren. Aber ab sofort lande ich in jeder der Module pom.xml wie unten fest codiert

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

und das übergeordnete Hauptmodul hat die folgende Konfiguration

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
Sandeepkunkunuru
quelle
1
Ihre Frage ist falsch angegeben und verwirrt Personen mit echten POMs mit mehreren Modulen ("Aggregat"). Aus Ihrem Beispiel und den Antworten geht hervor, dass es sich wirklich um ein übergeordnetes POM handelt, nicht um ein aggregiertes POM mit mehreren Modulen. Siehe maven.apache.org/pom.html#Aggregation .
Garret Wilson

Antworten:

627

Verwendung versions:setaus dem Versions-Maven-Plugin :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Es werden alle POM-Versionen, übergeordneten Versionen und Abhängigkeitsversionen in einem Projekt mit mehreren Modulen angepasst.

Wenn Sie einen Fehler gemacht haben, tun Sie dies

mvn versions:revert

danach oder

mvn versions:commit

wenn Sie mit den Ergebnissen zufrieden sind.


Hinweis: Bei dieser Lösung wird davon ausgegangen, dass alle Module das Aggregat-POM auch als übergeordnetes POM verwenden. Dieses Szenario wurde zum Zeitpunkt dieser Antwort als Standard angesehen. Wenn dies nicht der Fall ist, lesen Sie Garret Wilsons Antwort .

Sean Patrick Floyd
quelle
5
Es wäre großartig gewesen, wenn es eine Lösung gegeben hätte, bei der Sie nicht jedes Modul tatsächlich ändern müssen. Die einzige Alternative, die ich mir vorstellen kann, ist, immer eine Snapshot-Version für den Eltern-Pom zu verwenden.
AmanicA
53
Zusätzlich versions:setkann man angeben -DgenerateBackupPoms=false, dass dieses Plugin standardmäßig Original-POM-Dateien sichert.
Maksim Sorokin
19
Das ist der Punkt von versions:commit: "Entfernt die anfängliche Sicherung des POM und akzeptiert dadurch die Änderungen."
Michael Laffargue
2
Ein neues Plugin löst das in dieser Frage beschriebene Problem anders: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan
1
@ MichaelLaffargue MVN-Versionen: Commit scheint die Sicherungsdateien zu entfernen, die von der vorherigen pom.xml generiert wurden
Cris Rockwell
57

Bei der angegebenen Antwort wird davon ausgegangen, dass das betreffende Projekt zusätzlich zur Modulaggregation die Projektvererbung verwendet. In der Tat sind das unterschiedliche Konzepte:

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

Einige Projekte können eine Aggregation von Modulen sein, haben jedoch keine Eltern-Kind-Beziehung zwischen dem Aggregator-POM und den aggregierten Modulen. (Möglicherweise besteht überhaupt keine Eltern-Kind-Beziehung, oder die untergeordneten Module verwenden möglicherweise ein separates POM als "Eltern".) In diesen Situationen funktioniert die angegebene Antwort nicht.

Nach langem Lesen und Experimentieren stellt sich heraus, dass es eine Möglichkeit gibt, das Versions Maven Plugin zu verwenden nicht nur das Aggregator-POM, sondern auch alle aggregierten Module zu aktualisieren. es ist die processAllModulesOption. Der folgende Befehl muss im Verzeichnis des Aggregatorprojekts ausgeführt werden:

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

Das Versions Maven Plugin aktualisiert nicht nur die Versionen aller enthaltenen Module, sondern auch die Abhängigkeiten zwischen den Modulen !!!! Dies ist ein großer Gewinn, der viel Zeit spart und alle möglichen Probleme verhindert.

Vergessen Sie natürlich nicht, die Änderungen in allen Modulen festzuschreiben, was Sie auch mit demselben Switch tun können:

mvn versions:commit -DprocessAllModules

Sie können sich dafür entscheiden, auf das Backup-POMS ganz zu verzichten und alles in einem Befehl zu erledigen:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Garret Wilson
quelle
Wie automatisieren wir die nächste Version genauso wie das Build-Helper-Plugin?
Verlorene Übersetzung
Mit Maven 3.5.0 kann ich das nicht zum Laufen bringen. Ich habe Projektaggregation und nur der übergeordnete POM wurde aktualisiert. Ich habe auch die Projektvererbung versucht (zusammen mit der Aggregation - "alle drei Regeln" über den angegebenen Link), und wieder wurde nur der übergeordnete POM aktualisiert.
SiKing
1
Habe den geheimen Make-it-Work-Schalter gefunden: Die Startversion des übergeordneten POM und der Module muss identisch sein! Mein Eltern-Pom begann mit "1-SNAPSHOT" und die Module hatten "1.0.0-SNAPSHOT". :)
SiKing
1
Bei einem Aggregatorprojekt müssen die Version des Aggregators und die Versionen der Submodule nicht identisch sein. (ZB ändert sich Ihr Aggregator-POM möglicherweise nur selten und kann bei einer bestimmten Version bleiben, während einzelne Submodule ihre eigenen Release-Zyklen haben können.) Die Schlüsseleigenschaft, die für das versions:setPlugin angegeben werden muss, lautet -DoldVersion='*'unter mojohaus.org/versions-maven-plugin/set-mojo.html ausdrücklich, dass diese Eigenschaft bei der Verarbeitung eines Aggregatorprojekts angegeben werden sollte.
Matthew Wise
2
Unter welchen Bedingungen funktioniert das -DprocessAllModuleseigentlich? Es funktioniert nicht bei mir.
Alex R
23

Vielleicht möchten Sie sich das Ziel von Maven Release Plugin ansehen : Update-Versionen Ziel. Die übergeordnete Version sowie alle darunter liegenden Module werden aktualisiert.


Update: Bitte beachten Sie, dass es sich bei dem oben genannten um das Release-Plugin handelt. Wenn Sie nicht freigeben, möchten Sie möglicherweise verwendenversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Nishant
quelle
1
mvn version: set wirkt sich nicht auf module aus.
9ilsdx 9rvj 0lo
OK, wenn der Reaktoraufbau gleichzeitig übergeordnet ist. Es ist verwirrend, wenn die Struktur anders aussieht ...
9ilsdx 9rvj 0lo
mvn release:update-versions -DautoVersionSubmoduleshat gut funktioniert für mich, auch wenn ich nicht veröffentliche :-)
msa
23

Wenn Sie den Prozess vollständig automatisieren möchten (dh die Versionsnummer erhöhen möchten, ohne die aktuelle Versionsnummer kennen zu müssen), können Sie dies tun:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Malcolm Crum
quelle
3
Danke, @Crummy, du hast meinen Tag gerettet
Maksim Kostromin
Oder Sie können verwenden-DoldVersion='*'
Matthew Wise
11

Ich empfehle Ihnen, das Maven-Buch über Builds mit mehreren Modulen (Reaktoren) zu lesen .

Ich meinte insbesondere Folgendes:

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

sollte geändert werden in. Achten Sie hier auf die nicht definierte Version nur im übergeordneten Teil, in dem sie definiert ist.

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

Dies ist ein besserer Link .

khmarbaise
quelle
10
und was speziell suchen?
Thorbjørn Ravn Andersen
2
+1 für das Aufrufen der richtigen Formatierung für pom.xmlDateien, aber ich stimme (mit @ ThorbjørnRavnAndersen) zu, dass das Lesen eines ganzen Buches für diese Informationen übertrieben ist. : p
Priidu Neemre
7
Das Erben von Versionsinformationen vom übergeordneten Element entlastet leider nicht die Notwendigkeit, alle POM-Dateien im Projekt ändern zu müssen, da alle das übergeordnete Element anhand der Versionsnummer referenzieren .
Steven der leicht amüsierte
1
Sie könnten das Versions-Maven-Plugin verwenden, das all diese Dinge handhabt, oder Sie können das Maven-Release-Plugin verwenden, sodass Sie dies nicht manuell handhaben müssen ...
Khmarbaise
5

versions:update-child-modulesklingt wie das, wonach Sie suchen. Sie können Versionen ausführen: wie erwähnt einstellen, dies ist jedoch eine einfache Möglichkeit, die übergeordneten Versionsnummern zu aktualisieren. Ich bin der Meinung, dass Sie für die untergeordneten Module die <version>Definitionen entfernen sollten , da sie die Versionsnummer des übergeordneten Moduls erben.

Jon Onstott
quelle
3

Der beste Weg ist, da Sie beabsichtigen, Ihre Module zu bündeln, können Sie das <dependencyManagement>Tag im äußersten pom.xml(übergeordneten Modul) direkt unter dem <project>Tag angeben . Es steuert die Version und den Gruppennamen. In Ihrem individuellen Modul müssen Sie nur das <artifactId>Tag in Ihrem Modul angeben pom.xml. Es wird die Version aus der übergeordneten Datei übernommen.

murali
quelle
Ich kann das Tag dependencyManagement auf pom.xml nicht finden . Denkst du an etwas anderes ?
ArturoTena
0

Am einfachsten ist es, die Version in jeder pom.xml in eine beliebige Version zu ändern. Überprüfen Sie dann das Abhängigkeitsmanagement, um die richtige Version des in diesem Modul verwendeten Moduls zu verwenden! Wenn Sie beispielsweise die Versionierung für ein Schleppmodulprojekt erhöhen möchten, müssen Sie Folgendes tun:

im Kindermodul:

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

und im übergeordneten Modul:

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

So aktualisieren Sie die Hauptversion von pom.xml und die übergeordnete Version auf Submodulen:

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