-
Notifications
You must be signed in to change notification settings - Fork 7.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
利用Arthas排查Spring Boot应用NoSuchMethodError #160
Comments
给力 |
给力 |
1 similar comment
给力 |
牛逼 |
上面的issue是系统已经出现了NoSuchMethodError,如果想知道系统里还有哪些类,可能会造成NoSuchMethodError呢? 能否在maven打包时就能发现呢? 借这个issue机会,推广一下自己的插件。 https://github.com/hzdavid/findConflicts git clone https://github.com/hzdavid/findConflicts 然后在自己工程的pom.xml中,比如上面的Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError 然后mvn fc:go -Dshow.class.conflicts=true 类冲突,jar冲突,日志冲突一览无余. 刚才试过,AnnotationAwareOrderComparator 这个冲突类,这个插件就找到了。 希望楼主不要删除这个comment啊,偶可是arthas忠实fans。 have fun! |
这种问题一般都应该是包冲突造成的,一般的包用idea 的插件Maven Helper就能解决,阿尔萨斯应该在线上或回归环境定位诡异的问题才能体现她的价值吧 |
请教一下哈, dependence tree 能不能解决这个问题呢? |
dependence tree解决不了,dependence tree只能显示最终的jar依赖结果,这些jar有没有冲突,它并不知道。 |
点赞 |
请问下我现在通过Idea运行com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication#main 没有报错啊, 没有java.lang.NoSuchMethodError:异常的 怎么回事? |
maven enforcer 可以在引入依赖时就去发现冲突,而不是非要等到线上出现问题。 |
牛气! |
在我的场景下 java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V, 使用你的插件找不到具体冲突包啊 |
前言
有时spring boot应用会遇到
java.lang.NoSuchMethodError
的问题,下面以具体的demo来说明怎样利用arthas来排查。Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError
在应用的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
的异常信息,了解是什么类缺少了什么函数链接
The text was updated successfully, but these errors were encountered: