2012-09-27 10 views
15

In meinem Projekt gibt es eine Klasse, die eine Schnittstelle implementiert. Die Schnittstelle kommt aus einer Abhängigkeit. Ich habe eine andere Abhängigkeit, die selbst eine Abhängigkeit von einem Jar hat, das auch die gleiche Schnittstelle enthält, außer einer Version mit mehr Methoden; die zwei Gläser, die die gleiche Paketschnittstelle enthalten, haben NICHT die gleiche groupId oder artifactId.
Die Kompilierung schlägt fehl, weil der Compiler beschwert, dass die Klasse in meinem Projekt nicht alle Methoden implementiert. Ich erkannte, dass es ist, weil der Compiler die Schnittstellenreferenz von der falschen Dose nimmt. Meine Frage ist, Warum ist Maven die Schnittstelle aus der transitiven Abhängigkeit anstelle der aus dem Jar, die ich explizit im Projekt POM erwähnen? Ich kann sehen, dass das Glas, das verwendet wird, früher in der Definition erscheint (so stelle ich mir auch im Klassenpfad vor), aber ich dachte in diesen Fällen Maven löste es mit der kollidierenden Klasse/Schnittstelle aus der Abhängigkeit mit dem kürzesten PfadMaven Abhängigkeitsreihenfolge

Hier ist ein Teil des Abhängigkeitsbaums. Beachten Sie, dass diese grep, aber es kann immer noch zu sehen, dass javax.servlet:servlet-api (die tatsächlich verwendete) tiefer im Baum ist im Vergleich zu tomcat:servlet (derjenige, der verwendet werden soll)

[[email protected] proj]$ mvn dependency:tree | grep servlet 
[INFO] | +- javax.servlet:servlet-api:jar:2.4:compile 
[INFO] +- tomcat:servlet:jar:4.0.6:compile 

Ich verwende Maven 3.0 0,4

+0

Tomcat: Servlet: Jar sollte zur Verfügung gestellt werden, nicht kompilieren. Sie sollten mit javax.servlet: servlet-api kompilieren und eine Abhängigkeit von der entsprechenden Version hinzufügen. – OrangeDog

Antwort

14

warum maven mit der Schnittstelle von der transitiven Abhängigkeit anstelle der aus dem Glas, das ich explizit in der Projekt POM nennen?

Denn Maven haben die beiden nichts miteinander zu tun. Maven weiß nichts über Klassen- oder Paketnamen, Maven weiß nur von groupId und artifactId. Da diese nicht identisch sind, hat Maven keinen Grund, die transitive Abhängigkeit wegzulassen.

Und wenn ich richtig bin, plaziert Maven die Abhängigkeiten auf dem Klassenpfad in der Reihenfolge, in der sie definiert sind, d.h. die transitiven Abhängigkeiten der Abhängigkeit a erscheinen vor der Abhängigkeit b.

5

Wenn Sie Ihre Abhängigkeit auf der anderen jAR-Datei deklarieren können Sie es sagen, die transitive Abhängigkeit von der widersprüchlichen jAR-Datei ausschließen:

<dependency> 
     <groupId>group</groupId> 
     <artifactId>artifact</artifactId> 
     <version>1.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>othergroup</groupId> 
       <artifactId>ArtifactToExclude</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

Ja, ich dachte daran. Aber meine Frage, mehr als wie es zu beheben ist, warum Maven die Schnittstelle aus dem falschen Glas nehmen? Ich möchte die Logik verstehen – Hilikus

+3

In welchem ​​Fall ich denke, dass Sean Patrick Floyd korrekt ist, werden sie im Klassenpfad in der Reihenfolge angezeigt, in der sie in Ihrer Pom-Datei deklariert sind. –

Verwandte Themen