深入Spring Boot:利用Arthas排查NoSuchMethodError
前言
有时spring boot应用会遇到java.lang.NoSuchMethodError
的问题,下面以具体的demo来说明怎样利用arthas来排查。
Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError
在应用的main函数里catch住异常,保证进程不退出
很多时候当应用抛出异常后,进程退出了,就比较难排查问题。可以先改下main函数,把异常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
这个函数。
安装arthas
参考:https://alibaba.github.io/arthas/install-detail.html
使用sc命令查找类所在的jar包
应用需要抛出了异常,但是进程还没有退出,我们用arthas来attach上去。比如在mac下面:
./as.sh
然后选择com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication
进程。
再执行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
函数。
排掉依赖,解决问题
从上面的排查里,可以确定
AnnotationAwareOrderComparator
来自spring-2.5.6.SEC03.jar
,的确没有sort(Ljava/util/List;)V
函数。
所以,可以检查maven依赖,把spring 2的jar包排掉,这样子就可以解决问题了。
总结
- 仔细看
NoSuchMethodError
的异常信息,了解是什么类缺少了什么函数 - 利用arthas来查找类,反编绎源码,确认问题
原文链接
本文为云栖社区原创内容,未经允许不得转载。
深入Spring Boot:利用Arthas排查NoSuchMethodError相关推荐
- 利用Arthas排查NoSuchMethodError
1.前言 有时spring boot应用会遇到java.lang.NoSuchMethodError的问题,下面以具体的demo来说明怎样利用arthas来排查. Demo: https://gith ...
- 疑案追踪:Spring Boot内存泄露排查记
来源:美团技术团队 背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因 ...
- Spring Boot 利用WebUploader进行文件上传
Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...
- 深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.Array ...
- Spring Boot:自定义starter
来源:阿杜的世界 号外:最近整理了一下以前编写的一系列Spring Boot内容,整了个<Spring Boot基础教程>的PDF,关注我,回复:001,快来领取吧-!更多内容持续整理中, ...
- 当DUBBO遇上Arthas - 排查问题的实践
Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户. Github: https://github.com/apache/incubator-dubbo 文档:htt ...
- Spring Boot 应用迁移到 Java 11
你的Spring Boot App需要迁移到Java 11 吗? 最近,我们开始将应用程序从Java 8迁移到Java 11;在此之前,Oracle宣布将从2019年初开始停止为Java 8提供商业支 ...
- springboot_4 spring boot 使用servlet,filter,listener和interceptor
上一篇我们学习了 spring boot 利用Controller响应数据与响应页面. 一般的Web开发使用 Controller 基本上可以完成大部分需求,但是有的时候我们还是会用到 Servlet ...
- Tomcat8源码分析系列-spring boot集成tomcat
前言 本文基于 spring boot 1.5.9 spring boot 支持目前主流的 servlet 容器,包括 tomcat.jetty.undertow,可以在我们的项目中方便地集成这些 s ...
最新文章
- shell中if条件之数值的比较方法
- 输入文件c语言程序,C语言程序设计 对文件的输入输出.ppt
- redis install note
- DecExpress 帮助网站
- 【zookeeper系列】centos7安装zookeeper
- 力扣18. 四数之和(JavaScript)
- 李彦宏:我从未说过百度“All in AI”,这得怪陆奇
- Vue_(组件)实例属性
- 高等数学解题常用公式笔记总结
- 360浏览器保存网页html5,360浏览器怎么保存整个网页为图片?
- 东芝2303am维护清零_东芝打印机2303A怎样清零
- 关于一级域名和二级域名跨域的解决方案
- c语言中islower是什么函数,C语言中的isalpha,isdigit,islower,isupper等一系列函数...
- .img文件怎么打开(解压缩)
- DotA2表演赛全面总结 EHOME重拾王者霸气
- Git _ 报错信息
- Python工具函数
- python批量请求url_python批量请求注册接口爬虫相关问题记录
- 2.1-2.15笔记
- windows10安装更新很慢ndows,Windows10下载更新一直不动,进度为0怎么办?