2016-09-22 2 views
0

Angesichts der Eltern und Kind Pom unten und lib1 und lib2 enthalten beide die Klasse foo.bar.Test.Wie behandelt Maven transitive Abhängigkeiten, die von Eltern geerbt werden?

Mutter pom

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>foo</groupId> 
    <artifactId>foo-parent</artifactId> 
    <version>1.0</version> 
    <dependencies> 
     <dependency> 
      <groupId>my.transitive</groupId> 
      <artifactId>lib1</artifactId> 
      <version>1.0</version> 
     </dependency> 
    </dependencies> 
</project> 

Kind pom

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>foo</groupId> 
     <artifactId>foo-parent</artifactId> 
     <version>1.0</version> 
    </parent> 
    <artifactId>foo-child</artifactId> 
    <dependencies> 
     <dependency> 
      <groupId>my.transitive</groupId> 
      <artifactId>lib2</artifactId> 
      <version>1.0</version> 
     </dependency> 
    </dependencies> 
</project> 

Wenn ich foo-child als Abhängigkeit in myApp umfassen und instanziiert foo.bar.Test, welche Version der Klasse würde Maven lösen? Und warum?

meine app pom

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>myApp</artifactId> 
    <groupId>myApp</groupId> 
    <version>1.0</version> 
    <dependencies> 
     <dependency> 
      <groupId>foo</groupId> 
      <artifactId>foo-child</artifactId> 
      <version>1.0</version> 
     </dependency> 
    </dependencies> 
</project> 

Antwort

2

Die kurze Antwort wäre: es hängt davon ab, den man auf dem Classpath zuerst gefunden wird.

Es ist nicht ideal zwei Klassen derselben Klasse zu haben, die mit einer Anwendung gepackt sind, da dies zu vielen schwer zu debuggenden Fehlern führen kann ... Wenn Ihr myApp-Projekt nur ein Jar wird, wäre es am besten, es mit zu kompilieren die gleiche Bibliothek wie das, was zur Laufzeit verfügbar sein wird.

Ich glaube, Maven verwendet die Reihenfolge, die es auf den Pom geschrieben ist zu bauen. Eine Möglichkeit, um diese Suche würde den folgenden Befehl für myApp auszuführen:

mvn Abhängigkeit: Baum -Dverbose

Dadurch werden die Abhängigkeiten in der Reihenfolge gedruckt, dass sie auf dem Classpath pro spec erscheinen soll. Sie können Ausschlüsse immer verwenden, um vererbte Bibliotheken auszuschließen, die Sie möglicherweise nicht möchten. Hoffe das hilft.

+1

Sie können auch 'mvn Abhängigkeit: list' oder' mvn Abhängigkeit: build-classpath' verwenden, wenn Sie eine weniger ausführliche Definition des Klassenpfads wünschen. Im Allgemeinen wird Maven die "nearest definition" -Strategie verwenden, die hier beschrieben wird: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies – Daniel

Verwandte Themen