此文已由作者翟曜授權網易雲社區發布。
歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。
最近在測試過程中,遇到了幾次maven傳遞依賴沖突的問題,所以記錄下解決的過程,遇到類似問題供參照。
問題現象:
某服務不可用,查看啟動log有報錯信息,例如:
java.lang.NoSuchMethodError,類名和方法名看起來,初步判斷出是在某個依賴的jar包里。
排查步驟:
首先確認是哪個jar包。根據類名進行搜索,確認jar包為:netty。同時發現本地依賴的jar包版本都有多個,已經基本可斷定是依賴版本沖突了。
確定是netty,那么看下具體是哪些地方引入了netty,在應用根目錄打印依賴樹:mvn dependency:tree>tree.txt
發現報錯的nkv中引入的版本號是3.6.3.Final,dubbok引入的版本號是3.2.5.Final。可以斷定是maven傳遞依賴的沖突了。
也可以在測試服務部署機器的tomcat lib目錄下查找,確實是有兩個版本的依賴:
解決辦法:
附:概念解釋
1.Maven依賴傳遞
假如有Maven項目A,項目B依賴A,項目C依賴B。那么我們可以說 C依賴A。也就是說,依賴的關系為:C—>B—>A。
那么我們執行項目C時,會自動把B、A都下載導入到C項目的jar包文件夾中。這就是依賴的傳遞性。
2.依賴傳遞的排除
如上,C—>B—>A。加入現在不想執行C時把A下載進來,那么我們可以用 <exclusions>標簽。
<dependencies>
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>0.0.1</version>
<exclusions>
<exclusion>
<!--被排除的依賴包坐標-->
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>0.0.1</version>
</exclusion>
</exclusions>
</dependency>
</dependencies>
所以,上述錯誤現象的解決辦法就是:排除掉低版本依賴,引入高版本依賴。
提交代碼,再部署,服務啟動ok,調用ok。
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 為何要在網站上設置的驗證碼
【推薦】 網頁設計簡史看設計&代碼“隔膜”
【推薦】 限時購校驗小工具&dubbo異步調用實現限