使用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...

使用Intellij IDEA分析解決maven依賴衝突問題

結果顯示如下,樹狀的依賴關係,和dependency:tree命令結果一致,只不過是更形象的圖形化界面。

使用Intellij IDEA分析解決maven依賴衝突問題

依賴關係圖

2. 從之前的分析知道,org.springframework.core和org.springframework.asm不兼容(Incompatible),按Ctrl + F,輸入關鍵字asm,回車查看結果。

使用Intellij IDEA分析解決maven依賴衝突問題

查詢衝突的依賴

使用Intellij IDEA分析解決maven依賴衝突問題

依賴

這裡,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項目的類路徑中移除掉。

使用Intellij IDEA分析解決maven依賴衝突問題

此時,回到pom.xml中,會發現,多了exclusions標籤,將spring-asm從依賴中排除掉了。

使用Intellij IDEA分析解決maven依賴衝突問題

至此,問題解決!

擴展

普通的依賴是這種背景是土黃色的方格,綠色背景的方格表示該依賴是測試dependency。

使用Intellij IDEA分析解決maven依賴衝突問題

不同顏色的依賴


分享到:


相關文章: