2016-09-22 151 views
0

鑑於父母和孩子POM以下和lib1lib2都包括類foo.bar.TestMaven如何處理從父項繼承的傳遞依賴項?

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

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

如果我包括foo-childmyApp依賴和實例foo.bar.Test,類的版本將Maven的決心?爲什麼?

我的應用程序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> 

回答

2

簡短的回答是:這取決於哪一個在類路徑中第一。

將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