2011-01-11 3 views
4

Ich versuche, eine Annäherung an die folgende Situation zu bestimmen:Maven: Wie gehen Sie mit Abhängigkeiten um, die sowohl direkt als auch transitiv sind?

Es gibt 3 Maven Artefakte: A, B und C.

B auf A. abhängt (dh es verwendet einige Code von A ist)

C hängt von A und B ab (dh es verwendet einen Teil von A's Code und B's Code).

Angenommen ich verwenden möchte, sollte die gleiche Version von A sowohl für B und C.

Welche Ansatz verwendet werden?

1) Deklariere A als Abhängigkeit in Cs pom.xml.

Pro: Es ist dem Entwickler klar, dass C von A abhängt. Con: Wenn sich die Version von A ändert, muss sie an mehreren Stellen aktualisiert werden. (sowohl B als auch C)

2) Deklarieren Sie A nicht als Abhängigkeit in Cs pom.xml.

Pro/Contra: Gegenüber der Option 1.

+0

Typo: Ich denke du meinst "C hängt von A und B ab", als du sagtest: "C hängt von A und C ab" – Nishant

+0

Du hast recht. Ich habe den Tippfehler korrigiert. –

Antwort

3

1) Deklarieren A als Abhängigkeit in C der pom.xml.

Die Abhängigkeit ist lesbar

Dependency flexibel ist. Wenn Sie die Abhängigkeit von A von B entfernen möchten, müssen Sie nicht an die Projekte denken, die von B. abhängig sind.

Wie in other answer vorgeschlagen, ist es eine gute Vorgehensweise, direkte Abhängigkeiten in pom.xml aufzuschreiben und maven behandeln zu lassen es.

2) Deklarieren Sie A nicht als Abhängigkeit in Cs pom.xml.

Meistens wird kein Entwickler pom.xml sehen. Und wenn sie wollen, können sie es sehen, indem sie mvn dependency:tree benutzen und es wird transitive Abhängigkeit zeigen.

Wenn eine neue Version von A veröffentlicht wird, gibt es einen einzelnen Änderungspunkt. Wenn Sie die Abhängigkeit an mehreren Stellen definieren, vergessen Sie möglicherweise, alle Orte zu aktualisieren. In diesem Fall verwendet Maven automatisch den neuesten. Aber es sticht manchmal.

Einige Leute bevorzugen dies, weil meistens diese Art von Abhängigkeit allgemein bekannt ist (z. B. MyWebApp -> MyWebAppLib -> MySharedLib und MyWebApp -> MySharedLib) und sie wollen zusätzlichen Schritt der Aktualisierung von Versionen an mehreren Stellen in jedem Release vermeiden.

Ich habe Vor-und Nachteile geschrieben, sollten Sie bewerten, was Ihnen am besten selbst passt.


Edit # 1: tsk! Ich habe meine Kommentare gewechselt.
Bearbeiten # 2: aktualisiert die Antwort nach einer Diskussion auf this answer getan.

+0

@Jin Kim Ich habe die Optionen falsch gelesen. Also hatte ich in falscher Reihenfolge kommentiert. Behoben. – Nishant

+0

Mit Option (A) meinen Sie Option (1)? –

+0

@Jin Kim Ich habe den Beitrag aktualisiert, um etwas Sinn zu machen, hatte ich Ihre Optionen falsch eingefügt, früher. – Nishant

4

Ich denke, Sie sollten alle direkten Abhängigkeiten in Ihrem Pom deklariert haben. Transitive Abhängigkeiten sind nur ein Vorteil für die automatische Auflösung Ihrer Abhängigkeiten Abhängigkeiten.

Wenn Sie eine Version einer direkten Abhängigkeit ändern, werden sich wahrscheinlich auch die transitiven Abhängigkeiten ändern, wodurch das Modul möglicherweise zerstört wird. Das Modul sollte als unabhängige Einheit erstellt werden und sollte daher gut definierte Abhängigkeiten aufweisen, die nicht durch externe Änderungen unterbrochen werden.

Ich stimme nicht zu, dass dies den DRY-Prinzip verletzt, wie Maven Dinge innerhalb der Grenzen eines einzigen Projekts und seiner Pom definiert. Und in diesem Bereich gibt es keine Wiederholung.

Update: Die Abhängigkeit von transitiven Abhängigkeiten bestehenden macht das Projekt gebrechlich auf seine eigenen, und auch zu komplexeren Themen wie führen kann, wenn es zu schließen.

Wenn beispielsweise C eine Kompilierabhängigkeit von A hat, aber eine Laufzeitabhängigkeit von B, dann müssen Sie entweder die Abhängigkeit hinzufügen (da sie nicht mehr in Ihrem Erstellungspfad vorhanden ist) oder B als Kompilieren deklarieren es ist nicht. Es gibt viel zu sagen für die Klarheit. Definieren Sie explizit, was Ihre Abhängigkeiten sind und welchen Umfang sie haben, und erwarten Sie, dass Ihre Abhängigkeiten dasselbe tun. In den meisten Fällen ist Ihre Abhängigkeit eine Blackbox, bis sie Probleme verursacht und Sie sie öffnen müssen.

+0

Wenn zwei Versionen des gleichen Artefakts/Jars im Classpath vorhanden sind, ist das wahrscheinlich ein Durcheinander (Jar-Hölle). Es ist sehr wahrscheinlich, dass Sie eine einzelne Version in den abhängigen Projekten (B und C) haben möchten. Wenn Sie die Version von A aktualisieren möchten, müssen Sie dasselbe in zwei POMs (Wiederholung) aktualisieren oder es könnte ein Problem mit der Versionierung auftreten. Deshalb habe ich DRY erwähnt. – Nishant

+1

C hängt tatsächlich von A ab und sollte explizit angegeben werden. Die transitive Abhängigkeit 'C -> B -> A 'ist ein Implementierungsdetail von B und kann sich ändern. Sie sollten es nicht wissen oder sich darum kümmern. In Wirklichkeit kann das * zur Jar-Version der Hölle führen, aber es sollte Teil von Maven sein, angesichts seiner Position in der Toolchain, um über solche Probleme zu warnen und zu helfen. –

+1

@Nishant - Ich lasse Maven die Auflösung der Gläser behandeln, es legt nicht zwei in den Klassenpfad, es bestimmt, welchen man einfügt. Wie gesagt, die Projekte sind unabhängig und sollten als solche konfiguriert werden. Die Abhängigkeit von transitiven Abhängigkeiten verschleiert einfach, was Ihre Abhängigkeiten tatsächlich sind, was sie schwieriger zu verwalten macht, nicht einfacher, da das Projekt aufgrund von externen Änderungen anfälliger wird. – Robin

Verwandte Themen