2012-09-27 134 views
15

在我的項目中有一個實現接口的類。接口來自依賴關係。我有另一個依賴關係,它本身依賴於一個包含相同接口的jar,除了一個包含更多方法的版本;包含相同包接口的兩個罐不具有相同的groupId或artifactId。
編譯失敗,因爲編譯器抱怨我的項目中的類沒有實現所有的方法。我意識到這是因爲編譯器正在從錯誤的jar中取出接口引用。我的問題是,爲什麼maven使用來自傳遞依賴的接口而不是我在項目POM中明確提到的那個接口?我可以看到使用的jar出現在定義的早些時候(所以我想在classpath中也是如此),但我認爲在這些情況下,maven通過使用碰撞類/接口從依賴最短路徑Maven依賴項順序

這是依賴關係樹的一部分。 注意,這是grepped,但仍然可以看出,​​(實際使用的)相比,tomcat:servlet(應使用的一個)

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

我使用Maven 3.0是樹更深0.4

+0

tomcat:servlet:應該提供jar,不能編譯。您應該針對javax.servlet:servlet-api進行編譯,並在適當的版本上添加依賴項。 – OrangeDog

回答

14

爲什麼maven使用來自傳遞依賴項 的接口而不是我在 項目POM中明確提到的那個接口?

因爲,對於Maven來說,這兩者之間沒有任何關係。 Maven不知道類名或包名,Maven只知道groupId和artifactId。由於這些不一樣,Maven沒有任何理由忽略傳遞依賴。

如果我是正確的,Maven會按照它們定義的順序將依賴關係放在類路徑上,即依賴關係a的傳遞依賴關係出現在依賴關係b之前。

5

當你宣佈你對其他jar文件的依賴,你可以告訴它以排除衝突的jar文件的傳遞依賴:

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

是的,我想過這樣做。但我的問題,不僅僅是如何解決這個問題,爲什麼maven會從錯誤的jar中取出界面?我想了解邏輯 – Hilikus

+3

在這種情況下,我認爲Sean Patrick Floyd是正確的,他們將按照它們在pom文件中聲明的順序出現在classpath中。 –