您可以使用Maven依賴項插件的tree
goal來顯示項目中的所有傳遞依賴項,並查找說明「因衝突而忽略」的依賴項。 1
mvn dependency:tree -Dverbose
mvn dependency:tree -Dverbose | grep 'omitted for conflict'
一旦你知道它的依賴性有版本衝突,你可以使用includes
參數只顯示依賴關係導致一個看一個特定的依賴關係是如何被拉入。例如,一個項目中的不同的C版本由A和B拉到:
mvn dependency:tree -Dverbose -Dincludes=project-c
[INFO] com.my-company:my-project:jar:1.0-SNAPSHOT
[INFO] +- project-a:project-a:jar:0.1:compile
[INFO] | \- project-c:project-c:jar:1.0:compile
[INFO] \- project-b:project-b:jar:0.2:compile
[INFO] \- project-x:project-x:jar:0.1:compile
[INFO] \- (project-c:project-c:jar:2.0:compile - omitted for conflict)
要真正解決衝突,在某些情況下有可能找到一個版本的傳遞依賴,無論你的主要依賴將與工作的。將傳遞依賴添加到您的pom的dependencyManagement
部分,然後嘗試更改版本,直到有效。
但是,在其他情況下,可能無法找到適用於所有人的依賴版本。在這些情況下,您可能必須退回其中一個主要依賴項的版本,才能使用適用於所有人的傳遞依賴項版本。例如,在上面的例子中,A 0.1使用C 1.0,B 0.2使用C 2.0。假設C 1.0和2.0完全不兼容。但也許你的項目可能會使用B 0.1,而這恰好取決於與C 1.0兼容的C 1.5。
當然,這兩種策略並不總是有效,但我之前發現他們取得了成功。其他更激進的選項包括打包您自己的依賴項版本,以修復不兼容性或試圖在單獨的類加載器中隔離這兩個依賴項。
,因爲它似乎我的情況是,不能滿足每個人的依賴。這主要是因爲我將遺留軟件(可惜遺漏給我的遺留軟件)與具有共同依賴關係的較新庫合併在一起。因此,總而言之,最好的解決方案是在編譯時或之前收到錯誤和警告,以表明我需要做一些手動工作。至少它爲我節省了部署和解決衝突的麻煩。執行者插件似乎對這個方向很好。 –
由matts完美答案。 對我來說,我留下了一個問題,爲什麼不同版本的多個罐子不能一起存在?爲什麼模塊a鏈接到0.1版本的X can not使用鏈接到0.2版本的模塊b? 答案是 - >因爲類名: 「每個加載到虛擬機中的類都由三件事來唯一標識,它們的名稱,包和它的類加載器。 from: https://kepler-project.org/developers/teams/framework/design-docs/trade-studies/custom-class-loading/using-multiple-classloaders。 – Robocide