深入Spring Boot:利用Arthas排查NoSuchMethodError

在應用的main函數里catch住異常,保證進程不退出

在應用的main函數里catch住異常,保證進程不退出

很多時候當應用拋出異常後,進程退出了,就比較難排查問題。可以先改下main函數,把異常catch住:

深入Spring Boot:利用Arthas排查NoSuchMethodError


Demo啟動之後,拋出的異常是:

深入Spring Boot:利用Arthas排查NoSuchMethodError


顯然,異常的意思是AnnotationAwareOrderComparator缺少sort(Ljava/util/List;)V這個函數。

安裝arthas

參考:https://alibaba.github.io/arthas/install-detail.html

使用sc命令查找類所在的jar包

應用需要拋出了異常,但是進程還沒有退出,我們用arthas來attach上去。比如在mac下面:


深入Spring Boot:利用Arthas排查NoSuchMethodError


然後選擇com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication進程。

再執行sc命令來查找類:


深入Spring Boot:利用Arthas排查NoSuchMethodError


可以看到AnnotationAwareOrderComparator是從spring-2.5.6.SEC03.jar里加載的。

使用jad查看反編繹的源代碼

下面使用jad命令來查看AnnotationAwareOrderComparator的源代碼


深入Spring Boot:利用Arthas排查NoSuchMethodError


可見,AnnotationAwareOrderComparator的確沒有sort(Ljava/util/List;)V函數。

排掉依賴,解決問題

從上面的排查裡,可以確定

AnnotationAwareOrderComparator來自spring-2.5.6.SEC03.jar,的確沒有sort(Ljava/util/List;)V函數。

所以,可以檢查maven依賴,把spring 2的jar包排掉,這樣子就可以解決問題了。

總結

仔細看NoSuchMethodError的異常信息,瞭解是什麼類缺少了什麼函數

利用arthas來查找類,反編繹源碼,確認問題


分享到:


相關文章: