2015-12-22 81 views
2

Spring data gemfire 1.7.0.RELEASE對版本1.7.12slf4j-apijcl-over-slf4j有編譯時間依賴性。我在Maven的POM文件中定義的下面的依賴,因爲我們需要SLF4J 1.7.10依賴(其他幾個罐子依賴於此):maven如何解決spring數據gemfire的slf4j依賴問題?

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-gemfire</artifactId> 
    <version>1.7.0.RELEASE</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.10</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.7.10</version> 
    <scope>runtime</scope> 
</dependency> 

我有一個內部的maven回購作爲Maven的中央存儲庫。下面是我在不同的場景看,基於什麼罐子的行爲在Maven中央可供選擇:

enter image description here

我的問題:

  1. 在方案1,我不明白爲什麼構建沒有抱怨缺少1.7.12 jar。如何解決依賴關係?
  2. 在場景2中,1.7.10 jar如何在1.7.12中覆蓋1.7.12,而沒有在彈簧數據依賴關係中爲slf4j 1.7.12指定一個排除?
  3. 在場景3中,當maven中央缺少slf4j-parent 1.7.12的pom時,它爲什麼會投訴?由於1.7.10罐子存在,所以1.7.10罐子(類似於情況1)不應該運行良好嗎?

回答

1

答案是基於Maven Dependencies Mediation機制,特別是這樣的說法:

You can always guarantee a version by declaring it explicitly in your project's POM

所以,本質上,通過明確聲明它作爲你的依賴的一部分,你將覆蓋在傳遞依賴的任何版本,這樣你就不需要添加任何排除。你聲明它,你有這個項目的知識,Maven相信你。

所以在場景1和2中,Maven應用了上面的規則,並遵循POM中指定的規則。
在場景,因爲它根本沒有找到任何1.7.12版本,它甚至沒有試圖解決它,並信任你的POM。
在場景中,它解析了1.7.12的依賴關係樹,但是基於你的POM,版本1.7.10獲勝。
在場景它無法解決版本1.7.12的整個依賴關係樹,因此它給出了一個錯誤:是的,你的POM的版本將贏得任何,但因爲Maven有一個錯誤獲取完全依賴樹,它然後執行失敗。

雖然這是一個特殊情況,但最終確認只能通過查看您正在使用的Maven版本的相關代碼給出。

更新
我會建議在三種情況下要儘量有更多的細節,是從控制檯運行:

mvn dependency:resolve -Dsort=true -X 

由於調試標誌,它將提供在相關性中介過程中包含和排除的依賴關係列表。

作爲補充,運行:

mvn dependency:tree 

會給你完整的依賴關係圖,展示了實際上從POM採取什麼通過傳遞依賴來了。這可能會給你更多的信息。欲瞭解更多詳情,我建議看看Maven Dependency Plugin的目標。

+0

謝謝。在場景1中,它不應該嘗試解析1.7.12的依賴關係樹嗎? –

+0

事實上,這仍然是我唯一不清楚的地方,如果依賴關係根本不存在,並且POM覆蓋它,或者如果它存在,它可能會有不同的行爲,它會開始處理它,然後由於缺少部分而失敗在依賴關係圖中。你使用的是哪個版本的maven? –

+0

我更新了我的答案並提供了更多詳細信息。 –