一、問題描述
有個文件導入功能,用到了Hutool 的加密解密功能,本地運行完全可以,但是線上報錯:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class cn.hutool.crypto.SmUtil.........”,如下圖所示
提示沒有找到類NoClassDefFoundError,打開對應的JAR,查看class 是存在的,于是想到了JAR沖突,網上也有人說因為hutool-all 和hutool-core 兩個包沖突,可是檢查了我的項目,并沒有pom 引入了hutool-core????
難道是服務器的JAVA 環境問題? 于是本地打包后,啟動項目,仍然報錯,看來確實是因為maven 打包后導致的jar 沖突了,問題的關鍵點就是要找出沖突的jar 到底是哪個?
二、遠程DEBUG
既然本地運行沒有問題,只有打包后存在問題,那么就只能用到idea 的遠程DEBUG 功能了 。
1、打開 IDEA,點擊 Run > Edit Configurations。
2、點擊左上角的 +,選擇 Remote JVM Debug。
3、配置調試參數:
- Name:配置名稱(隨意)。
- Host:遠程服務器的 IP 地址或域名。
- Port:遠程服務器 JVM 的調試端口(如 5005),與你項目啟動端口不要一致
- 注意一下JDK 要與線上環境一致
點擊 Apply 保存配置。
4、把紅框這段代碼當做啟動參數添加到線上環境啟動腳本里
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
例如 java?-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005?-jar? your-project.jar
參數說明:
- agentlib:jdwp:啟用 JDWP 協議。
- transport=dt_socket:使用 Socket 進行通信。
- server=y:將當前 JVM 配置為調試服務器,等待調試客戶端連接。
- suspend=n:JVM 是否在啟動時掛起,n 表示不掛起,y 表示掛起直到客戶端連接。
- address=*:5005:指定調試監聽的端口。*:5005表示監聽所有IP地址的5005端口,也可以指定監聽xxx.xxx.xxx.xxx:5005
5、啟動遠程的線上項目后,記得本地idea 也啟動監聽
6、在報錯的代碼出打上斷點,這時候訪問遠程的線上接口,斷點會自動打進idea了
我的問題就是代碼53行報錯,這時候選中 SmUtil.sm2(privateKey, null);idea快捷鍵alt+F8
可見錯誤信息為:
class "org.bouncycastle.asn1.ASN1Encodable"'s signer information does not match signer information of other classes in the same package
現在找到了錯誤就是ASN1Encodable這個問題,在idea 里面雙擊shift ,搜尋這個類都存在哪些包里
好吧,浮出水面了,有兩個版本分別是bcprov-jdk14-138.jar 和 bcprov-jdk18on-1.73.jar
于是我手動在打包好的 lib 目錄里面刪除了較低版本bcprov-jdk14-138.jar? ,項目重啟,運行,測試通過
三、查看依賴關系,從項目上解決
方法一: 上面已經找到沖突的jar 了,接下來要找到究竟是在項目哪些jar 間接引用了這個bcprov-jdk14-138.jar,因為pom 里面搜不到
這里我們可以使用idea插件中的依賴分析插件,來幫助我們尋找沖突的jar包
成功下載后,找到我們的pom 文件,進行分析,如下圖
由此定位到了是core-renderer 這個包引用了bcprov-jdk14-138.jar ,確定這個類沒有被實際使用,直接排除就好了
方法二:如果不想下載插件,也可以用idea 自帶的maven分析視圖,注意要在下面選中對應pom
找到后,如需刪除直接選中右鍵,直接exclude 就好,會直接在pom 文件里面自動添加一下這段
<exclusions><exclusion><artifactId>bcprov-jdk14</artifactId><groupId>bouncycastle</groupId></exclusion></exclusions>