2010-09-07 10 views
6

Mein Projekt besteht aus 5 Unterprojekten. Einer ist ein Krieg, und die anderen 4 sind Gläser. Grundsätzlich benötigt das Kriegsprojekt alle 4 Jar-Projekte und ihre Abhängigkeiten.Wie man Abhängigkeiten von Unterprojekten in Maven behandelt

Ich kann die Abhängigkeiten entfernen, um etwas wie Krieg-> A-> B-> C-> D zu haben. Jedes Unterprojekt fügt seinen Anteil an externen Abhängigkeiten hinzu (Frühling, Struts, Winterschlaf), damit der Krieg am Ende alles bekommt, was er braucht.

Das sieht ziemlich gut organisiert und quadratisch aus, aber dann frage ich mich, ob das sehr praktisch ist, Änderungen vorzunehmen.

Stellen Sie sich vor, ich muss eine Zeile Code in Projekt D ändern, ohne etwas zu seinen Maven-Abhängigkeiten zu ändern. Ich müsste Projekt D offensichtlich erneut veröffentlichen, aber dann muss ich die Projekte C, B, A und den Krieg erneut veröffentlichen, nur um diese Änderung in ihren Pom-Dateien widerzuspiegeln. Dies kann lange und ärgerlich sein, besonders wenn Sie schnell eine neue Version veröffentlichen müssen, um etwas in der Produktion zu reparieren.

Ich könnte den Krieg von allen 4 Projekten abhängig machen, also muss ich nur die Projekt-D-Versionsnummer in der Kriegspom-Datei ändern. Aber dann habe ich Projekt A indirekt abhängig von Projekt D 1.0 und dem Krieg spezifizierenden Projekt D 1.1. Ich denke, dass die direkte Abhängigkeit des Krieges in diesem Fall gewinnen würde, nicht wahr?

Dies würde den neuen Krieg Release schneller machen, aber es würde auch meine Subprojekte Abhängigkeiten, da sie veraltet wäre.

Was wäre ein akzeptabler Weg, um mit dieser Situation umzugehen?

Antwort

3

Es gibt keine einfache Antwort auf Ihr Problem. .

Wenn Sie tatsächlich eine Kette von transitiven Abhängigkeiten haben (A-> B-> C-> D), dann ist es keine schlechte Option, jedes Modul unabhängig von der Kette freizugeben gute chance ihre verschachtelten abhängigkeiten sind einfache lib jars und werden nicht zu oft zu änderungen sehen.Hoffentlich werden sie nicht gezwungen werden, diesen prozess häufig zu durchlaufen.Täuschen sie vor, es wäre die gleiche situation wie wenn log4j aktualisiert würde und alle ihre modu les musste ebenfalls aktualisiert werden.

Eine andere Sache, die man beachten sollte, sind die Abhängigkeiten von WAR. Ja, Maven holt automatisch Abhängigkeiten für Sie heraus, aber es ist oft eine gute Vorgehensweise, Ihre bekannten Abhängigkeiten explizit zu deklarieren, so dass Sie für jedes Modul selbst eine Versionsnummer angeben können. Dies würde bedeuten, dass A direkt von D und den anderen abhängt. Wenn Sie widersprüchliche Versionsnummern haben, wie Sie es beschrieben haben, suchen Sie leider nach Problemen in Ihrem Klassenpfad. Wenn Sie wirklich dies obwohl tun müssen, um, Maven ermöglicht es Ihnen ausdrücklich transitive Abhängigkeiten ausschließen:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-B</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-C</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-C</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-D</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    ... 
</project> 

Hier die documentation ist diese optionalen Abhängigkeiten und Ausschlüsse zu beschreiben.

Müssen Sie B, C und D unabhängig voneinander freigeben? Wenn nicht, sollten Sie eine Aggregator pom.xml-Datei im Stammverzeichnis Ihrer Module verwenden. Auf diese Weise können Sie SNAPSHOT-Versionen in allen Modulen verwenden und dann den Bundle auf einmal freigeben.So verwaltet unser Team unser Multi-Modul-Projekt. Die Verwendung von SNAPSHOT-Abhängigkeiten stellt sicher, dass Sie die Version verwenden, die JUST erstellt wurde, wenn diese Artefakte benötigt werden.

+0

Hallo Gweebz. Danke für die ausführliche Antwort. Ich muss nicht jedes einzelne Teilprojekt einzeln veröffentlichen, also werde ich dieses Aggregator-Konzept, von dem ich nichts wusste, genau betrachten. Die Module enthalten alle Geschäfts- und Datencodes und müssen sich regelmäßig ändern. Eine andere Lösung wäre, die transitiven Abhängigkeiten auszuschließen, wie du gesagt hast, darüber habe ich nicht nachgedacht. Danke für das Licht. – IceGras

+0

Ohne die Notwendigkeit, jedes Modul unabhängig zu veröffentlichen, empfehle ich dringend, die Aggregator-Lösung zu verwenden. Das Muster passt perfekt zu Ihrem Szenario. Froh, dass ich helfen konnte :) –

1

Gibt es tatsächlich eines der Projekte A bis D unabhängig von der WAR? Wenn nicht, sehe ich keine Probleme mit Ihrem aktuellen Setup. Sie sollten absolut verwenden Sie die gleiche Version von jedem Modul während des Projekts. Andernfalls öffnen Sie die Tür der Hölle Classloader - glauben Sie mir, Sie nicht wollen, um dorthin zu gelangen :-(

um Freisetzungen zu erleichtern, die maven-release-plugin kann Ihnen helfen

+0

Hallo Péter. Die Projekte A bis D sind spezifisch für den WAR, aber ich muss sie einzeln veröffentlichen, damit andere Entwickler das WAR erstellen können und das Maven-Release-Plugin die Abhängigkeiten findet. Vielleicht sind diese Veröffentlichungen nicht notwendig? – IceGras

+0

@IceGras, jedes Mal, wenn Sie eine Änderung vornehmen, können Sie die Versionsnummer erhöhen. In unserem Projekt sind wir mit SNAPSHOT-Versionen während der Entwicklungszeit zufrieden und wir erstellen eine neue konkrete Version nur für offizielle Release (Kandidaten) s. –

+0

Die Arbeit mit Snapshots während der Entwicklungszeit scheint die beste Lösung zu sein, aber dann habe ich folgende Frage: Wenn Sie RC1 mit allen Modulen in Version 1.0 veröffentlichen, müssen Sie nur Modul C ändern. Wenn Sie RC2 freigeben, werden alle anderen Projekte inkrementiert Version für nichts dann? Auch meine Hauptbeunruhigung ist über Produktionsänderung. Wenn meine Version geändert werden muss, muss ich alle Versionsnummern ändern, um die Änderung widerzuspiegeln. – IceGras

1

Die beste Antwort in diesen Tagen ist jetzt verwenden Sie Gradle, die Beste von Ameise und Maven ist. Ich mochte Maven nie wirklich, aber Gradle nahm eine Menge der üblichen Konzepte, aber machte es mehr wie ant, indem es flexibel ist, so dass es keine einfache Antwort auf Ihre Frage in Großbuchstaben gibt;).

Verwandte Themen