2015-07-31 6 views
16

Ich dachte, dass die Reihenfolge der Maven-Abhängigkeiten keine Rolle spielt und betrachte dies als einen Vorteil. Und das ist meine alte pom.xml ‚s Abhängigkeiten:Warum Reihenfolge der Abhängigkeiten Maven wichtig?

<dependencies> 

    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>2.19</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>4.1.7.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-spring3</artifactId> 
     <version>2.19</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
     <version>2.19</version> 
    </dependency> 

</dependencies> 

Es funktioniert gut, und heute habe ich bewegen Frühjahr Abhängigkeit nach unten will, so dass diejenigen Trikot verwandten zusammen sein können. Allerdings kann ich dann nicht mehr machen es funktioniert, meine Jetty klagt:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/apache/commons/logging/LogFactory 

Das ist wirklich verwirrend ist, so habe ich zu Besorgnis über Ordnungsabhängigkeiten? Woher weiß ich die richtige Bestellung?

+0

Könnte nicht direkt Ihre Frage beantworten, aber ich normalerweise nur [erklärt das commons-logging] (https://github.com/jersey/jersey/blob/master/examples/helloworld-spring-webapp/pom.xml# L66). Überprüfen Sie, ob Sie immer noch das Problem haben, nachdem Sie es eingefügt haben, –

+0

@peeskillet, nachdem ich es eingefügt habe, wurde mein Jetty erfolgreich gestartet, aber meine Dienste können nicht ausgeführt werden. – Elderry

Antwort

34

Die Reihenfolge der Abhängigkeiten ist Angelegenheit wegen Maven löst transitive Abhängigkeiten, beginnend mit Version 2.0.9. Auszug aus dem documentation:

(...) Dies bestimmt, welche Version einer Abhängigkeit verwendet wird, wenn mehrere Versionen eines Artefakts angetroffen werden. (...) Sie können eine Version immer garantieren, indem Sie sie explizit im POM Ihres Projekts deklarieren. (...) Seit Maven 2.0.9 zählt die Reihenfolge in der Deklaration: die erste Deklaration gewinnt.

+2

Ich bin mir nicht sicher, warum diese Antwort abgelehnt wurde.Sie beantwortet - zumindest teilweise - die Frage, warum die Reihenfolge der Erklärung wichtig ist. –

+4

@KyleKrull Ich war ein Opfer von [downvote Vergeltung] (http://stackoverflow.com/a/31944564/1240557). Danke für deine +1. – kryger

4

auf die andere Antwort zu erweitern (die besagt, dass die Erklärung, um die Abhängigkeit des Maven Vermittlung für transitive Abhängigkeiten betrifft), gibt es ein paar Werkzeuge sind, können Sie verwenden:

  • mvn dependency:tree [-Dscope=[runtime|test]] Sie wird zeigen, was Wille Abhängigkeiten für den ausgewählten Bereich verfügbar sein. See here for details
  • mvn dependency:build-classpath gibt Ihnen die Reihenfolge, in der Abhängigkeiten für Ihren Klassenpfad verfügbar sind (wenn zwei oder mehr Klassenpfadeinträge dieselbe Klasse haben, gewinnt die frühere Klasse). See here for details

Ich weiß nicht viel über Ihre Situation, aber es ist oft der Fall, dass Sie mit der falschen Version von 1 oder mehr Gläser bei der Kompilierung/runtime aufzuwickeln. Declaring your own version of the library in question or locking down the version mit <dependencyManagement> sind Optionen hier.

Jetzt, um Ihre andere Frage zu beantworten - Woher wissen Sie, was die richtige Reihenfolge ist, wenn Abhängigkeiten deklariert werden?

Mein Vorschlag - die richtige Erklärung ist, um die eine, die Ihnen die Versionen der Abhängigkeiten, die Sie mögen, in der Reihenfolge, wie sie in wollen bekommt. Verwenden Sie die obigen Tools, um Ihre Abhängigkeiten zu überprüfen, und optimieren Sie die deklarierte Reihenfolge, falls erforderlich.

Beachten Sie, dass die meisten Gläser nicht eindeutig benannte Klassen enthalten. Daher ist die genaue Reihenfolge, in der Gläser auf Ihrem Klassenpfad angezeigt werden, normalerweise nicht so wichtig. Die einzige Ausnahme, die ich bemerkt habe, ist some jars in SLF4J, die absichtlich Klassen von den anderen Loggerbibliotheken abschirmt, die es ersetzen soll.

+0

Schöne Antwort und danke für die Links – slugmandrew

Verwandte Themen