前言

有时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相关推荐

  1. 利用Arthas排查NoSuchMethodError

    1.前言 有时spring boot应用会遇到java.lang.NoSuchMethodError的问题,下面以具体的demo来说明怎样利用arthas来排查. Demo: https://gith ...

  2. 疑案追踪:Spring Boot内存泄露排查记

    来源:美团技术团队 背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因 ...

  3. Spring Boot 利用WebUploader进行文件上传

    Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...

  4. 深入Spring Boot: 怎样排查 java.lang.ArrayStoreException

    java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.Array ...

  5. Spring Boot:自定义starter

    来源:阿杜的世界 号外:最近整理了一下以前编写的一系列Spring Boot内容,整了个<Spring Boot基础教程>的PDF,关注我,回复:001,快来领取吧-!更多内容持续整理中, ...

  6. 当DUBBO遇上Arthas - 排查问题的实践

    Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户. Github: https://github.com/apache/incubator-dubbo 文档:htt ...

  7. Spring Boot 应用迁移到 Java 11

    你的Spring Boot App需要迁移到Java 11 吗? 最近,我们开始将应用程序从Java 8迁移到Java 11;在此之前,Oracle宣布将从2019年初开始停止为Java 8提供商业支 ...

  8. springboot_4 spring boot 使用servlet,filter,listener和interceptor

    上一篇我们学习了 spring boot 利用Controller响应数据与响应页面. 一般的Web开发使用 Controller 基本上可以完成大部分需求,但是有的时候我们还是会用到 Servlet ...

  9. Tomcat8源码分析系列-spring boot集成tomcat

    前言 本文基于 spring boot 1.5.9 spring boot 支持目前主流的 servlet 容器,包括 tomcat.jetty.undertow,可以在我们的项目中方便地集成这些 s ...

最新文章

  1. shell中if条件之数值的比较方法
  2. 输入文件c语言程序,C语言程序设计 对文件的输入输出.ppt
  3. redis install note
  4. DecExpress 帮助网站
  5. 【zookeeper系列】centos7安装zookeeper
  6. 力扣18. 四数之和(JavaScript)
  7. 李彦宏:我从未说过百度“All in AI”,这得怪陆奇
  8. Vue_(组件)实例属性
  9. 高等数学解题常用公式笔记总结
  10. 360浏览器保存网页html5,360浏览器怎么保存整个网页为图片?
  11. 东芝2303am维护清零_东芝打印机2303A怎样清零
  12. 关于一级域名和二级域名跨域的解决方案
  13. c语言中islower是什么函数,C语言中的isalpha,isdigit,islower,isupper等一系列函数...
  14. .img文件怎么打开(解压缩)
  15. DotA2表演赛全面总结 EHOME重拾王者霸气
  16. Git _ 报错信息
  17. Python工具函数
  18. python批量请求url_python批量请求注册接口爬虫相关问题记录
  19. 2.1-2.15笔记
  20. windows10安装更新很慢ndows,Windows10下载更新一直不动,进度为0怎么办?

热门文章

  1. python如何强制结束主线程_强制结束线程
  2. 网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你
  3. labview圆环里实物动画图形_有趣的图形教案
  4. java 类加载 双亲委派_Java类加载器和双亲委派机制
  5. erp采购总监个人总结_erp采购总监总结.docx
  6. element-ui 可复选树型表格
  7. 《隐秘的角落》数学学霸朱朝阳如何炼成?这3招,你家孩子也能用上!
  8. 教授是如何教授数学思维的?
  9. 计算机思维与数学思维的本质区别
  10. 最大素数有用吗?安全上网就靠它