問題描述
為了做導出數據到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從依賴中排除掉了。
至此,問題解決!
擴展
普通的依賴是這種背景是土黃色的方格,綠色背景的方格表示該依賴是測試dependency。
閱讀更多 京京肚肚擼代碼 的文章