javascript
深入Spring Boot:利用Arthas排查NoSuchMethodError
前言
有時spring boot應(yīng)用會遇到j(luò)ava.lang.NoSuchMethodError的問題,下面以具體的demo來說明怎樣利用arthas來排查。
Demo:?https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError
在應(yīng)用的main函數(shù)里catch住異常,保證進(jìn)程不退出
很多時候當(dāng)應(yīng)用拋出異常后,進(jìn)程退出了,就比較難排查問題。可以先改下main函數(shù),把異常catch住:
public static void main(String[] args) throws IOException {try {SpringApplication.run(DemoNoSuchMethodErrorApplication.class, args);} catch (Throwable e) {e.printStackTrace();}// blockSystem.in.read();}Demo啟動之后,拋出的異常是:
java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)Vat org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:394)at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:383)at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:249)at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:225)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)at com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication.main(DemoNoSuchMethodErrorApplication.java:13)顯然,異常的意思是AnnotationAwareOrderComparator缺少sort(Ljava/util/List;)V這個函數(shù)。
安裝arthas
參考:https://alibaba.github.io/arthas/install-detail.html
使用sc命令查找類所在的jar包
應(yīng)用需要拋出了異常,但是進(jìn)程還沒有退出,我們用arthas來attach上去。比如在mac下面:
./as.sh然后選擇com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication進(jìn)程。
再執(zhí)行sc命令來查找類:
$ sc -d org.springframework.core.annotation.AnnotationAwareOrderComparatorclass-info org.springframework.core.annotation.AnnotationAwareOrderComparatorcode-source /Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jarname org.springframework.core.annotation.AnnotationAwareOrderComparatorisInterface falseisAnnotation falseisEnum falseisAnonymousClass falseisArray falseisLocalClass falseisMemberClass falseisPrimitive falseisSynthetic falsesimple-name AnnotationAwareOrderComparatormodifier publicannotationinterfacessuper-class +-org.springframework.core.OrderComparator+-java.lang.Objectclass-loader +-sun.misc.Launcher$AppClassLoader@5c647e05+-sun.misc.Launcher$ExtClassLoader@689e3d07classLoaderHash 5c647e05Affect(row-cnt:1) cost in 41 ms.可以看到AnnotationAwareOrderComparator是從spring-2.5.6.SEC03.jar里加載的。
使用jad查看反編繹的源代碼
下面使用jad命令來查看AnnotationAwareOrderComparator的源代碼
$ jad org.springframework.core.annotation.AnnotationAwareOrderComparatorClassLoader: +-sun.misc.Launcher$AppClassLoader@5c647e05+-sun.misc.Launcher$ExtClassLoader@689e3d07Location: /Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar/** Decompiled with CFR 0_132.*/ package org.springframework.core.annotation;import java.lang.annotation.Annotation; import org.springframework.core.OrderComparator; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order;public class AnnotationAwareOrderComparator extends OrderComparator {protected int getOrder(Object obj) {Order order;if (obj instanceof Ordered) {return ((Ordered)obj).getOrder();}if (obj != null && (order = obj.getClass().getAnnotation(Order.class)) != null) {return order.value();}return Integer.MAX_VALUE;} }Affect(row-cnt:1) cost in 286 ms.可見,AnnotationAwareOrderComparator的確沒有sort(Ljava/util/List;)V函數(shù)。
排掉依賴,解決問題
從上面的排查里,可以確定
- AnnotationAwareOrderComparator來自spring-2.5.6.SEC03.jar,的確沒有sort(Ljava/util/List;)V函數(shù)。
所以,可以檢查maven依賴,把spring 2的jar包排掉,這樣子就可以解決問題了。
總結(jié)
- 仔細(xì)看NoSuchMethodError的異常信息,了解是什么類缺少了什么函數(shù)
- 利用arthas來查找類,反編繹源碼,確認(rèn)問題
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的深入Spring Boot:利用Arthas排查NoSuchMethodError的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云智能视频 AI 重装来袭
- 下一篇: 双十一丝般顺滑体验背后:阿里云洛神网络虚