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.

  1. 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).
  2. 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

Schreibe einen Kommentar