Erstellen Sie in Maven Abhängigkeitsgruppen zur Wiederverwendung - einschließlich 'bereitgestellter' Abhängigkeiten

8

Ich bin neu bei Maven und richte mein erstes Maven-Projekt ein. Ich erschaffe auch einige Maven-Assets in Form einiger Poms, die in zukünftigen Projekten vererbt oder als Abhängigkeiten verwendet werden können. Ich möchte Abhängigkeiten zusammen gruppieren und in der Lage sein, sie bei Bedarf selektiv zu einem Projekt hinzuzufügen.

Ich habe diesen Artikel gelesen Pom Best Practices. Ich mag die Idee, zusammengehörige Abhängigkeiten in Poms zu gruppieren und dann das Pom als Abhängigkeit zu einem Projekt hinzuzufügen. Dieser Ansatz eignet sich hervorragend für die Kompilierung von Abhängigkeiten mit Abhängigkeiten. Es wird jedoch für die angegebenen Bereiche fehlgeschlagen, da sie als transitive Abhängigkeiten weggelassen werden.

Hier ist ein Beispiel, was ich meine: Sagen wir, ich gruppiere Web-Abhängigkeiten für meine Projekte in eine Web-deps pom.xml. Dazu gehören compile scoped Spring Framework Abhängigkeiten und auch ein provided scoped javaee one:

%Vor%

Ich füge diesen Pom dann als Abhängigkeit in ein anderes Projekt ein:

%Vor%

Die Abhängigkeiten in mvn-web-deps werden jetzt transitiv . Da die obige Abhängigkeitsreferenz compile scoped ist, wird die transitive Abhängigkeit provided weggelassen.

Ich möchte vermeiden, sie zum Abschnitt dependency eines übergeordneten Elements hinzuzufügen, da nur ein Elternteil vorhanden sein kann und ein Projekt möglicherweise nur einige dieser Abhängigkeitsgruppen benötigt, nicht alle. Ich kann sie vielleicht zum Abschnitt dependencyManagement hinzufügen, aber dann muss ich jede Abhängigkeit (ohne die Version) in jedem untergeordneten Projekt neu deklarieren.

Was ist der richtige / bessere Weg, Abhängigkeiten zu gruppieren und gleichzeitig die oben genannten Probleme zu vermeiden?

    
samitgaur 26.05.2011, 04:32
quelle

3 Antworten

6

Die kurze Antwort auf Ihre Frage lautet, dass Sie nur lokale Abhängigkeiten angeben sollten, für die der Code kompiliert werden muss, nicht jedoch in der übergeordneten pom.xml oder anderen Strukturen. Anzugeben, dass Sie eine 'bereitgestellte' Abhängigkeit in der globalen pom.xml haben, ist für Maven nicht sinnvoll, da sie in einer solchen pom.xml nicht kompiliert werden muss.

Hier ist die lange Antwort:

Als ich anfing, Maven zu verwenden, hatte ich die gleiche Idee, Artefakte und Abhängigkeiten in pom.xml-Modulen zu gruppieren, in der Hoffnung, dass sie in Zukunft nützlich wären. Jetzt, da ich etwas mehr Erfahrung habe, muss ich verstehen, dass es eine totale Zeitverschwendung ist. Für mich war das eine Form des Over-Engineering.

Ich habe gelernt, meine großen Projekte in separate Module aufzuteilen, jede in ihrem eigenen Subversion-Repository. Ich schließe Abhängigkeiten ein, die für jedes lokale Modul in ihrer pom.xml erforderlich sind. Ich gebe Versions-Tags jedes Moduls frei, so wie ich es codiere und wie es notwendig ist (d.h. wenn getestet und stabil).

Ich erstelle meine großen Projekte, indem ich ein eigenes Maven-Projekt mit einer eigenen pom.xml erstelle und meine Module als Abhängigkeiten importiere. Von Zeit zu Zeit aktualisiere ich die Version des Moduls in der Abhängigkeit, wenn ich eine Veröffentlichung gemacht habe. Dann lasse ich Maven den Job machen, alles zu ziehen, was es zu ziehen hat, auf einmal nicht, wenn das große Projekt kompiliert / veröffentlicht wird.

Maven erlaubt alle Arten von komplexen Konstruktionen und Hierarchie zwischen pom.xmls, aber IMHO diese Funktion schafft unnötige Unordnung und Komplexität. Bis jetzt hat es sich für mich nicht als ein echter Vorteil erwiesen. Zu Beginn hatte ich gehofft, dass das Kompilieren einer pom.xml den Rest kaskadierend korrekt kompiliert. Ich habe ein Ergebnis bekommen, aber was für ein Chaos in der ganzen globalen pom.xml zu halten.

Das Freigeben der Artefakte meines Moduls und das Erstellen meines Projekts auf diesen Releases hat mir so viel Zeit erspart, dass ich es nur empfehlen kann. Insgesamt habe ich weniger pom.xml zu pflegen und sie sind auch weniger komplex. Für dasselbe Endergebnis ...

Also, wenn Ihr einziger Grund für die Erstellung von globalen / strukturellen pom.xml eine Hoffnung ist, Zeit zu sparen, empfehle ich, diese Idee aufzugeben ... Separate Code in separaten Projekten, veröffentlichen und DANN kompilieren global.

    
JVerstry 26.05.2011 05:41
quelle
3

Ich kam zu dem Schluss, dass Maven nicht für diesen Anwendungsfall ausgelegt war. Am Ende habe ich ein Elternteil pom.xml mit allen Bibliotheken, die ich benutze, dem Abschnitt <dependencyManagement> hinzugefügt. Alle neuen Projekte / Module, die ich erstelle, haben ihre pom.xml vom übergeordneten pom.xml übernommen und fügen jede benötigte Abhängigkeit ihrem eigenen <dependencies> -Abschnitt hinzu, abzüglich der Version. Dieses Schema ermöglicht es mir, die Versionen für die Bibliotheken, die ich verwende, und die Repository-Deklarationen, die sie benötigen, an einem einzigen Ort zu verwalten. Ein weiterer Vorteil (gegenüber dem Versuch, Abhängigkeitsbündel zu erstellen) besteht darin, dass dadurch die Bibliotheken, die den untergeordneten Poms hinzugefügt werden, feiner gesteuert werden können - nur die Abhängigkeiten, die tatsächlich benötigt werden, werden hinzugefügt.

    
samitgaur 18.11.2011 15:51
quelle
1

Abhängigkeiten von bereitgestellten Bereichen werden zwar von übergeordneten POM geerbt, aber NICHT von POM, die als Abhängigkeiten definiert sind, und ich halte das für eine Schwäche von Maven.

Da Maven auch Schwierigkeiten hat, Module als Abhängigkeiten zwischen Modulhierarchien hinzuzufügen, kann ich nicht sagen, dass Maven ein ausgeklügeltes Werkzeug zur Verwaltung von Projekten mit mehreren Modulen ist. Maven erwartet eine strenge Single-Rooted-Hierarchie, die nur für einfachste Projekte geeignet ist.

    
Agustí Sánchez 13.04.2013 14:12
quelle

Tags und Links