Es scheint verschiedene Möglichkeiten zu geben, Eltern-Poms in einem Multiprojekt-Build zu strukturieren, und ich frage mich, ob jemand darüber nachgedacht hat, welche Vor- und Nachteile die einzelnen Aspekte haben.
Die einfachste Methode, einen Eltern-Pom zu haben, besteht darin, ihn in die Wurzel eines Projekts zu legen, d. H.
myproject/
myproject-core/
myproject-api/
myproject-app/
pom.xml
Dabei ist die Datei pom.xml sowohl das übergeordnete Projekt als auch die Module -core -api und -app
Die nächste Methode besteht darin, das übergeordnete Element wie in in ein eigenes Unterverzeichnis zu unterteilen
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
Wo der übergeordnete POM noch die Module enthält, diese aber relativ sind, z. B. ../myproject-core
Schließlich gibt es die Option, bei der die Moduldefinition und das übergeordnete Element wie in getrennt sind
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
pom.xml
Wobei das übergeordnete pom eine "gemeinsam genutzte" Konfiguration enthält (dependencyManagement, Eigenschaften usw.) und myproject / pom.xml die Liste der Module enthält.
Die Absicht ist, auf einen großen Build skalierbar zu sein, sollte also auf eine große Anzahl von Projekten und Artefakten skalierbar sein.
Ein paar Bonusfragen:
- Wo ist der beste Ort, um die verschiedenen gemeinsam genutzten Konfigurationen wie Quellcodeverwaltung, Bereitstellungsverzeichnisse, allgemeine Plugins usw. zu definieren? eine gemeinsame).
- Wie gehen das Maven-Release-Plugin, Hudson und Nexus damit um, wie Sie Ihre Multiprojekte einrichten (möglicherweise eine große Frage, es ist mehr, wenn jemand herausgeholt wurde, wann ein Multiprojekt-Build eingerichtet wurde)?
Bearbeiten: Jedes der Unterprojekte hat seine eigene pom.xml, ich habe es weggelassen, um es knapp zu halten.
quelle
Antworten:
Um diese Frage zu beantworten, müssen Sie meiner Meinung nach im Hinblick auf den Projektlebenszyklus und die Versionskontrolle denken. Mit anderen Worten, hat der Eltern-POM einen eigenen Lebenszyklus, dh kann er separat von den anderen Modulen freigegeben werden oder nicht?
Wenn die Antwort ja lautet (und dies ist bei den meisten Projekten der Fall, die in der Frage oder in den Kommentaren erwähnt wurden), benötigt der übergeordnete POM aus VCS- und Maven-Sicht ein eigenes Modul, und Sie werden am Ende sein mit so etwas auf VCS-Ebene:
Dies macht das Auschecken ein bisschen schmerzhaft und eine übliche Art, damit umzugehen, ist die Verwendung
svn:externals
. Fügen Sie beispielsweise eintrunks
Verzeichnis hinzu:Mit folgender externer Definition:
Ein Auschecken von
trunks
würde dann zu der folgenden lokalen Struktur führen (Muster # 2):Optional können Sie sogar ein
pom.xml
imtrunks
Verzeichnis hinzufügen :Dies
pom.xml
ist eine Art "gefälschter" Pom: Es wird nie veröffentlicht, es enthält keine echte Version, da diese Datei nie veröffentlicht wird, es enthält nur eine Liste von Modulen. Bei dieser Datei würde ein Auschecken zu dieser Struktur führen (Muster 3):Dieser "Hack" ermöglicht es, einen Reaktor nach dem Auschecken von der Wurzel aus zu starten und die Dinge noch praktischer zu machen. Auf diese Weise richte ich gerne Maven-Projekte und ein VCS-Repository für große Builds ein : Es funktioniert einfach, lässt sich gut skalieren und bietet die Flexibilität, die Sie möglicherweise benötigen.
Wenn die Antwort nein ist (zurück zur ursprünglichen Frage), dann können Sie mit Muster Nr. 1 leben (tun Sie das Einfachste, was möglicherweise funktionieren könnte).
Nun zu den Bonusfragen:
Ehrlich gesagt, ich weiß nicht, wie ich hier keine allgemeine Antwort geben soll (wie "Verwenden Sie die Ebene, auf der es Ihrer Meinung nach sinnvoll ist, Dinge zu verinnerlichen"). Außerdem können Kinder-Poms geerbte Einstellungen immer überschreiben.
Das Setup, das ich benutze, funktioniert gut, nichts Besonderes zu erwähnen.
Eigentlich frage ich mich, wie das Maven-Release-Plugin mit Muster Nr. 1 umgeht (insbesondere mit dem
<parent>
Abschnitt, da Sie zur Release-Zeit keine SNAPSHOT-Abhängigkeiten haben können). Das klingt nach einem Henne-Ei-Problem, aber ich kann mich nicht erinnern, ob es funktioniert und zu faul war, um es zu testen.quelle
Nach meiner Erfahrung und den Best Practices von Maven gibt es zwei Arten von "Eltern-Poms".
"Unternehmen" übergeordnetes POM - Dieses POM enthält Ihre unternehmensspezifischen Informationen und Konfigurationen, die jedes POM erben und nicht kopiert werden müssen. Diese Informationen sind:
Die Vorbereitung dieses übergeordneten Poms muss mit Vorsicht erfolgen, da alle Poms Ihres Unternehmens davon erben. Daher muss dieser Pom ausgereift und stabil sein (die Veröffentlichung einer Version des übergeordneten Poms sollte sich nicht auf die Freigabe aller Ihrer Unternehmensprojekte auswirken!)
Mutliprojekte haben eine Baumstruktur - Sie sind also nicht auf eine Ebene des Eltern-Poms beschränkt. Versuchen Sie, eine geeignete Projektstruktur für Ihre Bedürfnisse zu finden - ein klassisches Beispiel ist die Verteilung von Mutimodul-Projekten
Diese Konfiguration muss mit Bedacht in einen "Firmen" -Eltern-Pom und einen Projekt-Eltern-Pom (s) aufgeteilt werden. Dinge, die sich auf alles beziehen, was Sie projektieren, gehen an die Muttergesellschaft des Unternehmens, und dies bezieht sich auf das aktuelle Projekt.
Die Muttergesellschaft des Unternehmens muss zuerst freigelassen werden. Für Multiprojekte gelten Standardregeln. CI-Server müssen alle wissen, um das Projekt korrekt zu erstellen.
quelle
Ein unabhängiges übergeordnetes Element ist die beste Vorgehensweise für die gemeinsame Nutzung von Konfiguration und Optionen für ansonsten entkoppelte Komponenten. Apache hat ein übergeordnetes POM-Projekt, um rechtliche Hinweise und einige gängige Verpackungsoptionen zu teilen.
Wenn in Ihrem Projekt der obersten Ebene echte Arbeit enthalten ist, z. B. das Zusammenfassen von Javadoc oder das Packen einer Version, treten Konflikte zwischen den für diese Arbeit erforderlichen Einstellungen und den Einstellungen auf, die Sie über das übergeordnete Element freigeben möchten. Ein Projekt nur für Eltern vermeidet dies.
Ein gängiges Muster (das momentan die Nummer 1 ignoriert) besteht darin, dass die Projekte mit Code ein übergeordnetes Projekt als übergeordnetes Projekt und die oberste Ebene als übergeordnetes Projekt verwenden. Dies ermöglicht die gemeinsame Nutzung von Kernsachen, vermeidet jedoch das in Nr. 2 beschriebene Problem.
Das Site-Plugin wird sehr verwirrt, wenn die übergeordnete Struktur nicht mit der Verzeichnisstruktur übereinstimmt. Wenn Sie eine aggregierte Site erstellen möchten, müssen Sie ein wenig herumspielen, um dies zu umgehen.
Apache CXF ist ein Beispiel für das Muster in # 2.
quelle
Beim dritten Ansatz gibt es einen kleinen Haken. Da aggregierte POMs (myproject / pom.xml) normalerweise überhaupt keine übergeordneten Elemente haben, teilen sie die Konfiguration nicht. Das bedeutet, dass alle diese aggregierten POMs nur Standard-Repositorys haben.
Dies ist kein Problem, wenn Sie nur Plugins von Central verwenden. Dies schlägt jedoch fehl, wenn Sie das Plugin mit dem Plugin: Goal-Format aus Ihrem internen Repository ausführen. Beispielsweise können Sie
foo-maven-plugin
mit der groupIdorg.example
das Ziel angebengenerate-foo
. Wenn Sie versuchen, es mit dem Befehl like vom Projektstamm aus auszuführenmvn org.example:foo-maven-plugin:generate-foo
, kann es nicht auf den Aggregatmodulen ausgeführt werden (siehe Kompatibilitätshinweis ).Es sind mehrere Lösungen möglich:
quelle