在應用的main函數里catch住異常,保證進程不退出
在應用的main函數里catch住異常,保證進程不退出
很多時候當應用拋出異常後,進程退出了,就比較難排查問題。可以先改下main函數,把異常catch住:
Demo啟動之後,拋出的異常是:
顯然,異常的意思是AnnotationAwareOrderComparator缺少sort(Ljava/util/List;)V這個函數。
安裝arthas
參考:https://alibaba.github.io/arthas/install-detail.html
使用sc命令查找類所在的jar包
應用需要拋出了異常,但是進程還沒有退出,我們用arthas來attach上去。比如在mac下面:
然後選擇com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication進程。
再執行sc命令來查找類:
可以看到AnnotationAwareOrderComparator是從spring-2.5.6.SEC03.jar里加載的。
使用jad查看反編繹的源代碼
下面使用jad命令來查看AnnotationAwareOrderComparator的源代碼
可見,AnnotationAwareOrderComparator的確沒有sort(Ljava/util/List;)V函數。
排掉依賴,解決問題
從上面的排查裡,可以確定
AnnotationAwareOrderComparator來自spring-2.5.6.SEC03.jar,的確沒有sort(Ljava/util/List;)V函數。
所以,可以檢查maven依賴,把spring 2的jar包排掉,這樣子就可以解決問題了。
總結
仔細看NoSuchMethodError的異常信息,瞭解是什麼類缺少了什麼函數
利用arthas來查找類,反編繹源碼,確認問題
閱讀更多 魔都小老表vlog 的文章