使用Intellij IDEA分析解決maven依賴衝突問題
問題描述
為了做匯出資料到Excel功能,引入了easypoi的dependency,啟動後,報出了以下錯誤:
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
在網上找到的答案如下,簡單說就是jar包版本不一致,衝突了!
3.0.6中,ClassVisitor 是一個介面(interface ClassVisitor),而在3.2.0中,ClassVisitor變成了抽象類(abstract class ClassVisitor)。為了解決這一問題,最好的辦法就是版本一致,也就是所有spring的包,最好是同一個版本,或同一階段的版本。
解決步驟
1. 開啟pom.xml檔案,依次選擇Maven -> Show Dependencies...
結果顯示如下,樹狀的依賴關係,和dependency:tree命令結果一致,只不過是更形象的圖形化介面。
依賴關係圖
2. 從之前的分析知道,org.springframework.core和org.springframework.asm不相容(Incompatible),按Ctrl + F,輸入關鍵字asm,回車檢視結果。
查詢衝突的依賴
依賴
這裡,spring-asm使用的是3.1.1.RELEASE版本,而spring-core使用的是4.3.8.RELEASE版本,版本不一致!可能有讀者要問了,spring-core明明也是3.1.1.RELEASE版本。這裡其實maven有個依賴選擇原則“路徑最短優先”,easypoi-web依賴spring-core的4.3.8版本,同時也依賴spring-webmvc -> spring-core3.1.1版本,按照該原則,優先選擇4.3.8版本的spring-core,這也就解釋了為啥兩者不一致了。
其實從圖中也可直觀的看出,虛紅線,表示該依賴其實是指向了另外的一個版本;實紅線,表示該依賴其實有多個不同的版本(點選即可顯示虛紅線)。
3. 知道了問題根源,也就好解決了:右擊spring-asm,選擇Exclude即可,表示將spring-asm從easypoi-web專案的類路徑中移除掉。
此時,回到pom.xml中,會發現,多了exclusions標籤,將spring-asm從依賴中排除掉了。
至此,問題解決!
轉載自:https://baijiahao.baidu.com/s?id=1583991534087303439&wfr=spider&for=pc