2017-10-09 115 views
1

我與依賴關係存在衝突問題。2個不同依賴項問題中的相同界面

我的項目有兩個依賴關係是這樣的:

dependencies { 

    provided group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' 

    compile files('path/to/ABC.jar') 

} 

ABC.jar有它自己的依賴關係​​:

dependencies { 

    provided group: 'javax.servlet', name: 'servlet-api', version: '2.5' 

} 

這裏是我處理這個問題;我需要使用ServletContext接口,它由servlet-api庫提供,編譯器使用錯誤的接口。

Gradle按照here所述自動解決版本衝突。

但在我的情況下,它並沒有幫助,因爲它只適用於依賴項有兩個不同的版本。在這種情況下;雖然這是一個較新的版本問題,但名稱已從​​更改爲javax.servlet:javax.servlet-api。所以Gradle不會自動解決這個衝突,因爲它似乎不是一個版本問題。

我試過的東西是用here所描述的排除傳遞依賴。

compile files('path/to/ABC.jar') { 
    exclude group: 'javax.servlet' 
} 

但它沒有工作,似乎exclude不適用於本地'jar'文件。

現在,我不知道還有什麼要做。

如何排除作爲本地文件添加的依賴項的依賴關係?

(如果第一個問題還沒有任何答案)我怎麼能說編譯器使用正確的ServletContext接口?

回答

3

compile files('path/to/ABC.jar')是一個文件依賴項,文件依賴項沒有任何依賴項信息,所以它不會引入傳遞依賴項。如果這個ABC.jar是一個「胖」的JAR中包含依賴類的jar,它不適合用於像Gradle,Maven或Ant/Ivy這樣的用於處理依賴關係的東西。您必須使用正確聲明的依賴關係來使用適當的「精簡」版本的依賴關係,或者您需要在生成腳本中「重新打包」該JAR以排除不想引入的依賴關係類。無依賴關係管理可以爲你做這個。

您可以執行gradlew dependencyInsight --configuration runtime --dependency javax.servlet:servlet-apigradlew dependencies --configuration runtime來找出依賴關係的確切來源。


其實你的例子甚至不應該編譯如果我正確地看到它,因爲它應該最有可能是

compile files('path/to/ABC.jar'), { 
    exclude group: 'javax.servlet' 
} 

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

但正如我所說,用一個本地文件依賴關係沒有傳遞依賴關係,因此排除無論如何都沒有意義。


爲了使搖籃版本衝突魔力的工作,你可以簡單地告訴搖籃,這些庫實際上只是使用不同的座標相同的庫通過更換模塊像

dependencies { 
    modules { 
     module('javax.servlet:servlet-api') { 
      replacedBy 'javax.servlet:javax.servlet-api' 
     } 
    } 
} 

然後搖籃看到他們作爲同一個庫,可以做它的版本衝突解決魔法。是否需要舊版本的庫仍然適用於新版本,這是一個不同的話題,您必須檢查和/或嘗試一下。這種情況總是取決於新版本是否向後兼容舊版本。

1

我現在沒有辦法測試這個,但我相信你的語法是錯誤的。我這裏有一些例子,看起來不同,在你的情況將是:

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

正如我說的,我現在不能測試,檢查是否有幫助,並給予評論。