2016-09-22 13 views
0

以下の親と子のpomがあり、lib1lib2には両方ともクラスfoo.bar.Testが含まれています。Mavenは親から継承した推移的な依存関係をどのように扱いますか?

親ポンポン

<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> 

子ポンポン

<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> 

私はmyAppで依存関係としてfoo-childを含めるとfoo.bar.Testをインスタンス化した場合、クラスのバージョンに解決Mavenのでしょうか?なぜ?

私のアプリのポンポン

<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> 

答えて

2

短い答えは次のようになります。それは、最初のクラスパスで発見された1に依存します。

2つの同じクラスをアプリケーションにパッケージ化すると、エラーをデバッグするのが困難になることがあるので理想的ではありません。myAppプロジェクトがちょうどjarになる場合は、実行時に利用できるライブラリと同じライブラリです。

私はmavenが構築するためにpomに書き込まれる順序を使用すると信じています。 myAppに対して次のコマンドを実行することですこれを見ての一つの方法:

MVNの依存関係:ツリー

-dverboseこれは、彼らが仕様に従ってクラスパス上に表示されなければならないことを順番に依存関係を出力します。いつでも除外を使用して、継承していないかもしれないライブラリを除外することができます。お役に立てれば。

+1

クラスパスをあまり冗長に定義したくない場合は、 'mvn dependency:list'や' mvn dependency:build-classpath'を使うこともできます。一般的に、Mavenはここで説明する「最も近い定義」戦略を使用します:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies – Daniel

関連する問題