Wie die Umstrukturierung von Maven multi-Modul-Projekt?
Ich entschuldigt für die Länge von diesem post, aber ich hatte Mühe, wodurch es kompakter wird, ohne dass von der Bild. Ich habe vor kurzem geerbt, die job-build-master für ein maven-3.0-multi-Modul-Projekt. Das problem ist, dass die Struktur des Projekt - /Modulen ist eine Katastrophe. Aus der Art, wie die Dinge sind derzeit gespeichert in Source Control (wir verwenden RTC), um die pom-Struktur der Module, bin ich reißen meine Haare aus versuchen, um eine vollständige build-Zyklus abgeschlossen, und das jedes mal.
Als Projekt-Hierarchie geht, alle Module gespeichert sind "flach"; das heißt: alles ist auf dem gleichen Niveau. Ich habe ein parent-pom, und alle Module hängt von den Eltern. Jedoch der andere Elternteil ist auf der gleichen Ebene wie alle meine anderen Module.
Ex:
c:\dev\MyEarProject
+ parent-pom
- pom.xml
+ module1
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module2
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module3
- pom.xml (depends on parent-pom)
- src
- main
- ...
Den parent-pom definiert alle Module erforderlich, um das Projekt zu erstellen, sowie eine Reihe von Eigenschaften, die für Artefakt-version zahlen, die in den verschiedenen teilmodule:
<modules>
<module>../module1</module>
<module>../module2</module>
<module>../module3</module>
</modules>
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<slf4j.version>1.6.4</slf4j.version>
<repositoryAddress>${snapshots.repo.url}</repositoryAddress>
<my.hibernate-module.dao.impl>1.2.3</my.hibernate-module.dao.impl>
<my.hibernate-module.dao.api>1.2.3</my.hibernate-module.dao.api>
</properties>
Jedem Modul pom, wiederum, hängt von der parent-pom über die pom - Artefakt-Nummer:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
Um Dinge zu machen, noch mehr verwirrend, das eigentliche Artefakt-name kann, oder auch nicht (je nach Modul), mit der Modul-Pfad. Zum Beispiel, "module1" befinden sich möglicherweise in Pfad c:\dev\MyEarProject\module1
aber haben Artefakt-name hibernate-module
. Jedoch, aufgrund der Art, wie es gespeichert wird im RTC, das Verzeichnis heißt module1
wenn es ausgecheckt ist.
Am einfachsten zu bauen ist alles, natürlich, ist zu gehen in c:\dev\MyEarProject\parent-pom\
und führen mvn clean deploy
. Dies funktioniert gut, wenn in den SNAPSHOT-Modus, mit dem SNAPSHOT-repo ermöglicht mehrere Implementierungen der gleichen Artefakt-version. Aber im release-Modus, dies fehl.
Diese Struktur verursacht 2 Probleme für mich.
- Jedesmal, wenn ich brauche, um eine änderung version einer Eigenschaft in der übergeordneten, habe ich zum update des parent-pom version und-Nummer, und alle untergeordneten Module parent pom version und alle untergeordneten Module version selbst (da die Eltern geändert).
- Wenn ich mich bereitstellen, ein release-Zyklus, mvn wirft einen Fehler, wenn eines der Module nicht verändert hat seit dem letzten Zyklus und kann daher nicht anderweitig eingesetzt werden, um die gleiche repo (repo nicht erlauben, das überschreiben von vorhandenen Artefakten)
So, ich bin auf der Suche nach der beste Weg, um die Umstrukturierung dieses Projekt, um diese Probleme zu vermeiden. Für die parent-pom, ich weiß, ich kann einen relativen Pfad verwenden, zeigen Sie auf die Eltern statt. Jedoch, angesichts der "flachen" Struktur der Module, ist dies eine empfohlene Vorgehensweise (sprich: die parent-pom relative Pfad ../parent-pom/pom.xml - scheint ein wenig seltsam für mich)? Zusätzlich, gegeben, dass die Versionsverwaltung der Eltern ist unabhängig von den Modulen, wäre mit einem relativen Pfad und nicht nur die Tür öffnen, um weitere Verwirrung (sprich: gäbe es keine Möglichkeit zu wissen, welche version des parent-pom zugeordnet ist, welche version der submodule).
Zweitens, wie kann ich das ganze Ohr ohne auf das bereitstellen von Fehler, die ich habe? Da das Artefakt bereits in der repo, brauche ich nicht neu erstellen und erneut bereitstellen. Ich habe versucht, mit --Projekte, aber mit der Anzahl der Module beteiligt sind, wird es extrem schwierig zu verwalten.
InformationsquelleAutor Eric B. | 2012-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Sache, die ich wirklich empfehlen kann ist die Umstrukturierung der Projekte-Ordner ...das heißt, die Projekte, die Ordner repräsentieren die Struktur, die Mittel NICHT glätten die Struktur.
Als Ergebnis, dass der Abschnitt "Module" deiner Eltern wird vereinfacht so:
Darüber hinaus die übergeordneten Einträge in Ihren Modulen vereinfacht werden können, sowie wie diese:
...das bringt mich zum nächsten Punkt:
Wenn Ihr Aktuelles Projekt definieren Ihre Eltern wie oben, das ist einfach falsch, Ursache versuchen zu finden, den Eltern im repository und nicht in eine Obere-Ebene-Ordner. In anderen Worten ist das verursachen von viel von Ihren Problemen mit dem freigeben etc.
Wenn wir dieses problem zu beheben, es muss so Aussehen, das ich nicht empfehlen kann:
Eine andere Sache, die ich beobachte, ist, dass Sie nicht
SNAPTSHOT
's, die ersetzt werden durch das release plugin während der release-phase. Und in der Beziehung, dass es automatisch alle Versionen in die entsprechenden Eltern etc.Im Idealfall sind die Module sollten wie folgt Aussehen:
Verursachen alle Module Erben die version und
groupId
von Ihren Eltern. Manchmal ist es nützlich oder erforderlich zu ändern-ModulegroupId
aber es ist eine Ausnahme.Auf, was ich Las ist über die separate Versionierung der Eltern. Das macht einfach keinen Sinn, weil es den Eltern, Ihre Module so legen Sie es in der gleichen Struktur und natürlich die gleiche VCS.
Wenn Sie wollen, um einige Konfiguration/plugins-Versionen, Abhängigkeiten, die genutzt werden sollte für andere Projekte, als auch über eine separate corporate
pom.xml
das ist ein separates Projekt und werden GESONDERT veröffentlicht etc.Nachdem Sie Ihre Struktur ändert, können Sie einfach in der parent-pom-Verzeichnis und tun
mvn clean package
odermvn release:prepare release:perform
aus diesem Ordner und alles wird einfacher.Wenn Sie möchten, weiter zu kämpfen gegen maven it ' s your turn, aber ich empfehlen, um änderungen an der Struktur verursachen, es wird Ihr Leben leichter machen. Aber wenn die Idee zum bereitstellen jedes Modul einzeln nicht sinnvoll. Entweder sind Sie verwandt sind die nicht. Wenn Sie nicht haben, als Sie sollten machen Sie Sie wirklich getrennt und nicht mit einem multi-Modul bauen.
Ich habe Schwierigkeiten zu verstehen, wie dies zu tun mit der Versionsnummer definiert wird, in der Eltern nur. In meinem aktuellen setup, ändern kann ich das interface in einem Modul, ohne den rest des zu bauen, bis es Zeit ist, um die Wiedereingliederung der neuen version. Mit der version, die nur in der übergeordneten, änderung der Schnittstelle eines Moduls bricht übrigen die bauen da alle Module setzen auf den Quellcode-Baum und nicht ein pre-bereitgestellt binäre. Wie vermeide ich dieses problem? Ich muss immer noch individuell version jedes Modul, muss ich nicht?
Wenn Sie wirklich brauchen, separate Versionen, was bedeutet, in anderen Worten separate Versionen müssen Sie separate Module und nicht ein multi-Modul bauen.
Wenn wir dieses problem zu beheben, es muss so Aussehen, das ich nicht empfehlen kann - also, was empfehlen Sie?
InformationsquelleAutor khmarbaise
Wenn Sie der Veröffentlichung Ihrer POM, müssen Sie die release-updates, aber Sie müssen Sie nicht ändern POM-Versionen von hand - Sie können update-Versionen automatisch über die plugin-Versionen oder release-plugin. Ich Neige dazu, lieber das release-plugin, da es sonst zu Begehen SCM auch für Sie.
http://mojo.codehaus.org/versions-maven-plugin/
http://maven.apache.org/plugins/maven-release-plugin/
Ihre repository-manager kann auch erlauben, dass das überschreiben einer existierenden version, aber es ist besser, Praxis, eine neue version rausgebracht.
Neige ich dazu, lieber das flache Modul-Struktur es erlaubt, die übergeordneten Ordner zum speichern von gemeinsamen Dateien wie z.B. checkstyle-Konfiguration. Ich finde es auch nützlich, um die Gruppe teilen-id über Module dann benennen Sie das Modul-Verzeichnis das gleiche wie die artifactId.
Die plugin-Versionen sollten in der Lage sein, aktualisieren Sie die Abhängigkeiten für Sie, dann können Sie einfach Begehen, und bereitstellen der neuen Artefakte.
InformationsquelleAutor cvanes
Präsentieren Sie sich widersprechende Anforderungen. Sie wollen neu strukturieren Ihr Projekt aber nicht können, Dinge bewegen. Sie wollen vereinfachen Sie Ihr deployment und release-Zyklen, aber nicht wollen, zu einem einzigen version.
Gegeben, dass änderungen in einem Modul wird sich zwangsläufig auf alle abhängigen Module, die ich benutzen würde eine einfache version ' Ing Schema, wo alle sub-Module Erben Ihrer Eltern-version. maven release:prepare-und release-Zyklen einfach werden. Verwenden Sie einen release notes verfolgen Sie Ihre änderungen, und begründen das überspringen unnötige Tests unverändert-Module (änderungen zu version ändern sich nicht, die bauen/Binär-Ausgabe des build-Prozess, so dass Sie können verwenden Sie diese als Ihre primäre argument).
Gutes Glück mit Ihrem Projekt.
InformationsquelleAutor Pierre