So aktualisieren Sie die version der untergeordneten Modulen in Maven?
So aktualisieren Sie die version der untergeordneten Module? Es gibt eine Menge von Stackoverflow Fragen wie diese, aber ich war nicht in der Lage zu finden, die passen genau dieses Szenario... würde gerne, falls dieser ein Duplikat ist.
Betrachten Sie das folgende Projekt.
parent
--mod1
--mod2
Anfang ein dev-release-Zyklus brauche ich zum aktualisieren der übergeordneten und Module auf die gleiche version. Wenn die version der Eltern und Module gleich geblieben, während der release dann würde ich würde Sie einfach weglassen, die <version>
tag aus die Module und führen Sie versions:set -DnewVersion=1.1.1
zum Auftakt der dev-Zyklus. Aber wie es sich herausstellt werden die Module nicht alle am Ende des Zyklus mit der gleichen version. Als bugs und fixes, die materialisieren Sie nur die Module mit den bugs und so aktualisiert. Zum Beispiel die Eltern-und mod2 vielleicht in version 1.1.1-RC1, aber mod1 sein könnte 1.1.1-RC2.
Als solche, die ich brauche, um:
1) einen <version>
tag in die Module zum nachverfolgen der einzelnen Module version unabhängig.
2) Wenn mod2 erfordert mod1 einer Abhängigkeit, die ich brauche, um sicherzustellen, mod2 und verweist auf die neueste version von mod1.
Dies führt auf die folgenden zwei Fragen.
1) Am Anfang des Zyklus wie kann ich die Eltern und die Module auf die gleiche version in einem maven-Befehl? Ich habe versucht version:set -DnewVersion=1.1.1
, aber das nur die updates die Eltern-version über alle POM ' s aber nicht die Modul-version. Ich habe auch versucht -N versions:update-child-modules
, aber ich glaube, ich benutze es falsch, weil es nichts tut, zeigt nur, übersprungen für alle Module.
2) Dies ist eine etwas härter und passt zu Artikel 2 oben. Wie aktualisiere ich die beiden mod1 version und mod2 Verweis auf mod1 version in einem Schritt? Ich weiß wie es in 2 Schritten:
parent-pom:
<properties>
<!-- update this manually if mod1's version no longer matches parent -->
<mod1.version>${project.version}</mod1.version>
</properties>
mod2 pom:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>mod1</artifactId>
<version>${mod1.version}</version>
</dependency>
Wenn mod1 Beulen bis zu 1.1.1-RC2 update ich die parent-POM und mod1 POM, diese zu reflektieren. Diese werden in zwei Schritten. Jedenfalls, um es wiederum in einem Schritt?
Mein Beispiel war klein, aber im wirklichen Leben gibt es viele Module, die diese wichtige Zeit sparen, außerdem bin ich neugierig.
- Ich würde vorschlagen, ändern Sie Ihre Vorgehensweise und macht neue RCs alle Module auch nur einige von Ihnen zu ändern. Synchronisieren Sie Ihre release-Zyklus lassen und "release:vorbereiten," damit die version zu aktualisieren für Sie.
- Vielen Dank für die Beratung. Dieser war bereits auf dem Tisch als eine option. Irgendeine Idee, wie das zu vollbringen, was wird angefordert?
- Ich habe gesehen, dass
${mod1.version}
variable Satz in der parent-pom, rief dann in die child-poms<version>${mod1.version}</version>
und Abhängigkeiten, obwohl Sie aus Maven 3 Warnungen, ich bin sicher, es gibt viele gute Gründe, dies nicht zu tun. - Sie wissen, habe ich versucht, das auf den ersten. Ich wurde immer Fehlermeldungen, so dass ich dachte, es könnte nicht getan werden. Aber ich versuchte es wieder und der Grund, warum es nicht funktionierte war, weil ich hatte
mod1.version
zuproject.version
, in der parent-POM, und das führt zu einer rekursiven Fehler. Wenn ichmod1.version
auf eine Konstante, dann funktioniert es. Nun brauche ich nur noch einen Weg, um all diemodX.version
's und die Eltern-version auf den gleichen Wert am Anfang des release-Zyklus. - Mit diesem Ansatz der beste Weg ist leider manuell ändern Sie die Eigenschaften in der übergeordneten
pom.xml
vor release. Aber ich bin verwirrt, warum Sie möchten, um up-version sub-Komponenten für ein major-release, als hatten Sie sich nicht eigentlich verändert? - guter Punkt. Also denke ich, zwei Möglichkeiten, es zu tun wäre, lassen jedes Modul auf die version, die Sie waren organisch, oder die version, die alle Module und Eltern zusammen. Stattdessen wählte der Kunde zu version alles alle Module zusammen, die zu Beginn des Zyklus, sondern nur dann, nur bis die version auf die Module mit bugs/fixes nach RC1. Ich denke, das hat damit zu tun, die nicht wollen, um eine erneute Verteilung aller Module. Ich werde Ihren Vorschlag in einer Sitzung heute.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage 1)
Der beste Weg, um zu verwalten, application lifecycle und Veröffentlichungen ist die Verwendung des release-plugin.
Wie Sie vielleicht wissen, Maven-Philosophie ist die Konvention über die Konfiguration. Maven-Konvention ist die snapshot-Versionen (die mit der Endung-SNAPSHOT) während der Entwicklung und der Zuordnung einer nicht-snapshot-version nur für releases.
Sagen, Sie sind der Entwicklung von version 1.1.1. Während in der Entwicklung, die Sie gerade verwenden 1.1.1-SNAPSHOT. Maven wird sich darum kümmern-updates, die Momentaufnahme. Wenn ein Artefakt-repository, die Sie verwenden können, U um sicherzustellen, dass Sie immer die Letzte version des snapshots.
Wenn der release fertig ist, release-plugin generiert und setzt die version 1.1.1 und updates POM ist mit der neuen Entwickler-version, wie 1.1.2-SNAPSHOT.
Über multimodule Projekte, gibt es zwei Szenarien: die Module sind Verwandte, aber voneinander unabhängig (wie mehrere web-Anwendungen) oder Sie sind Module von einem einzigen großen Anwendung oder Bibliothek, und Sie teilen-Versionen. Sie scheinen daran interessiert, die letzteren.
Der beste Weg in diesem Fall ist nur die Erben die gleichen Eltern (vielleicht auch root) Modul, einschließlich der version. Sie verweisen übergeordnete Gruppe:Artefakt:version und Sie nicht angeben, eine version für die Kinder. Allgemein sind Sie auch Erben-Gruppe, so dass Ihr Kind pom Aussehen kann:
Nun müssen Sie nur, auf Kinder aufzupassen, verweist auf die richtige version des Elternteils, der mit Hilfe der release-plugin.
Ihm zu helfen, wissen über Kinder, sollten Sie Ihre parent-pom auch ein root-pom indem Sie den Abschnitt "Module", wie Sie später sehen werden.
Frage 2)
Ich in der Regel erklären Eigenschaften in der übergeordneten mit allen Versionen aller Artefakte, die referenziert werden können. Wenn mehrere Module teilen version, brauchen Sie nur eine Eigenschaft. Die Eltern können so Aussehen:
Kinder können Verweise auf andere Module mit
Es ist eine sehr schlechte Praxis zu erklären Abhängigkeiten mit NEUESTEN. Sagen Sie, dass Sie hierzu für die version 1.1.1. Jetzt arbeiten Sie mit version 1.1.2-SNAPSHOT und wahrscheinlich hast du auch Artefakte, die mit dieser version installiert in Ihrem lokalen repo.
Nun sagen, aus irgendeinem Grund müssen Sie neu erstellen version 1.1.1, zum Beispiel aufgrund eines Fehlers in der Produktion. Ihr build die neue version verwenden. Wenn Sie Glück haben, diese brechen das bauen. Wenn du Pech hast, kann es sogar unbemerkt in die Produktion.
Nicht zuletzt, wie einige Leute mithilfe von property-Werten zu erklären, die Kinder-Versionen. Dieser wird dringend abgeraten und wird berichtet, dass die Warnung von maven. Ich persönlich glaube nicht, jemals tun Sie es. Die Gründe sind auch in Bezug auf die Reproduzierbarkeit von builds und die Tatsache, dass maven geht davon aus, dass ein release-build wird sich nie ändern. Mit einer Modul-version extern tweakable ist nicht wirklich eine gute Idee.
EDIT:
Fall, wenn die Modul-Versionen sind nicht ausgerichtet.
Tatsächlich beide Szenarien gemischt werden kann.
Sie können, zum Beispiel:
Eltern
---Component1
---Component2
---Component3
------Comp3Module1
------Como3Module2
------Comp3Module3
Wo die Eltern und die drei-Komponenten-Versionen unterschiedlich sind und die drei Module des component3 teilen gleiche version wie vorher erklärt.
Frage 1)
In diesem Fall wird jedes Modul hat seine version infependently angegeben.
Wie gesagt, es ist eine schlechte prsctise zu verwenden, eine Eigenschaft, um anzugeben, Modul-version, der Grund, warum ich nur empfehlen kann buchstäblich angeben-Versionen.
Wie schon gesagt, zu verwalten, Versionierung, der beste Weg ist, um release-plugin, sowie die Integration mit dem Versionskontrollsystem wie SVN.
Andere Antworten geben, details, wie es zu benutzen, damit ich nicht aufwändig es weiter, es sei denn, angefordert.
Frage 2)
Die empfohlene Vorgehensweise ist die gleiche, erklärte der für den Fall der Freigabe die gleiche version, nur, dass Sie mehrere Eigenschaften.
Die Eltern können so Aussehen:
Dann können Sie mit dependency management zu zentralisieren version management in der Muttergesellschaft.
Beispielsweise in parent-pom,
Nun, verweisen Sie jedes Modul von jedem anderen Modul, und es ist so einfach:
Versionen werden automatisch geleitet von der Muttergesellschaft. Sie nicht brauchen, um Sie zu pflegen, in Kinder, die Abhängigkeiten, die sich auch weniger ausführlich.
1) ich habe auch versucht die version:in der Vergangenheit, aber nie dazu gekommen es richtig arbeitet. Es ist eigentlich der gleiche Prozess wie die Veröffentlichung:Vorbereitung, aber es eigentlich gar nicht. Also, was Sie könnten versuchen, ist
mvn release:prepare -DautoVersionSubmodules -DdryRun
. Das soll machen, dass alle die updates ohne Prüfung alles, was in der repo und ohne irgendwelche tags.2) ich glaube, die ClearTK-Projekt einmal verfolgt eine ähnliche Strategie wie du: Sie erhalten ein multi-Modul-Projekt mit jedes Modul hat seine eigenen release-Zyklus. Aufenthalt auf der Höhe der situation, Sie implementiert eine benutzerdefinierte maven-plugin, um Sie warnen vor der Abhängigkeit-version Unstimmigkeiten.
https://github.com/ClearTK/cleartk/tree/master/consistent-versions-plugin
Während so ein plugin wäre nicht die updates, die Sie anfordern, sollte es zumindest benachrichtigt Sie, wenn Aktualisierungen erforderlich sind. Wirklich Ihr problem lösen, Sie könnten erwägen, die gleiche route wie ClearTK haben und setzen Sie Ihre eigene Maven-plugin (oder Sie tun, was ClearTK schließlich zu tun: Umschalten auf einen synchronisierten release-Zyklus 😉 )
Ok das ist, was ich kam mit. Diese basiert auf dieser continuous-Freigabe-von-maven-Artefakte Artikel.
Parent-POM:
Beispiel Kind POM mit inter-Projekt-Abhängigkeit:
1) Am Anfang des Zyklus wie kann ich die Eltern und die Module auf die gleiche version in einem maven-Befehl?
Müssen Sie sich nicht mehr. Das parent-POM bleibt die gleiche version, nur ändern, wenn die parent-POM verpasst. In diesem Fall können Sie
mvn version:set -DnewVersion=1.1.1
. Aber Sie brauchen nicht, um für diesen Ansatz.Stattdessen kann man dynamisch festlegen, die version mit der Eigenschaft
main.version
. E. g.mvn clean deploy -Dmain.version=1.1.1
Auch, um zu erzwingen, dynamische übergabe der Versionsnummer, können Sie die Standard -main.version
Eigenschaft, die ich in meiner parent-POM oben.2) Wie aktualisiere ich die beiden mod1 version und mod2 Verweis auf mod1 version in einem Schritt?
Diese im Grunde läuft darauf hinaus, wie die Verwaltung Revisionen. Wenn ich nicht die
revision
Eigenschaft in der mvn-Kommando, dann werden alle Module verwendenSNAPSHOT
als die revision. Wenn ich dierevision
EigenschaftRC1
dann alle Module erhalten, die revision. Außerdem, wenn ichrevision
zuRC1
aberModule4.revision
zuRC2
dann Module4 bekommt RC2 und alle anderen Module bekommen RC1. Dies erfüllt die Anforderung des Kunden ist, dynamische änderungen auf einer pro Modul basis.Hier sind einige Beispiele:
mvn clean deploy -Dmain.version=1.1.1
Setzt alle Module auf version1.1.1-SNAPSHOT
.mvn clean deploy -Dmain.version=1.1.1 -Drevision=RC1
Setzt alle Module auf version1.1.1-RC1
.mvn clean deploy -Dmain.version=1.1.1 -Drevision=RC1 -DModule4.revision=RC2
Setzt alle Module auf version1.1.1-RC1
außer für Module4 die version1.1.1-RC2
.Gibt es eine Einschränkung, die erwähnt werden muss. Wenn Sie erhöhen Sie die version einer abhängigen Modul, z.B. Modul1, zu RC2, dann müssen Sie auch erhöhen Sie die version aller Module, die es verwenden, zum Beispiel Module4 muss nicht erhöht werden, RC2 (oder die nächste version) auch. Dies ist etwas, das der client wurde bewusst gemacht, und es ist auch der Grund, warum ich lieber alle Module haben die gleiche version. Aber ich finde, wie dynamisch es raus kam. Im wesentlichen die version ist nun über die Kommandozeile mit keine updates zu POM-Dateien erforderlich.
1) @rec, sagte, das maven-release-plugin würde den trick tun
2) können Sie definieren, Abhängigkeit von mod2 auf mod1 wie:
Mehr info: Wie Sag ich es Maven verwenden die neueste version einer Abhängigkeit?
Getestet habe ich beide Lösungen und es funktioniert! Hoffe es hilft dir 🙂