【Arthas案例】两个GAV-classifier不同的snakeyaml.jar,引起NoSuchMethodError

3分钟内解决问题

两个不同的GAV-classifier依赖冲突,引起NoSuchMethodError

Maven依赖的三坐标体系GAV(G-groupId,A-artifactId,V-version)

classifier通常用于区分从同一POM构建的具有不同内容的构件物(artifact)。它是可选的,它可以是任意的字符串,附加在版本号之后。

【案例1】某应用依赖两个GAV-classifier不同的snakeyaml.jar,引起NoSuchMethodError

1.完整的异常调用栈【从案发现场找线索】

警察抓犯人,收集线索是破案的关键所在。

完整的异常调用栈

2.关键的异常日志

从异常信息中收集有用的线索。

java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.SafeConstructor.<init>(Lorg/yaml/snakeyaml/LoaderOptions;)V
  at org.apache.dubbo.rpc.cluster.router.condition.config.model.ConditionRuleParser.parse(ConditionRuleParser.java:44)

java.lang.NoSuchMethodError that class no longer has a definition of that method.
该类不再具有该方法的定义。

java.lang.NoSuchMethodError

3.案发现场的源代码

org.apache.dubbo.rpc.cluster.router.condition.config.model.ConditionRuleParser.parse(ConditionRuleParser.java:44)

  • jad - 反编译指定已加载类的源码
[arthas@41915]$ jad org.apache.dubbo.rpc.cluster.router.condition.config.model.ConditionRuleParser parse

ConditionRuleParser.java:44,与异常信息对上了。

ConditionRuleParser.java:44

org.yaml.snakeyaml.constructor.SafeConstructor点击链接到snakeyaml-1.23-android.jar

SafeConstructor

org.yaml.snakeyaml.constructor.SafeConstructor

4.应用里依赖两个snakeyaml.jar是怎么回事?

Maven: org.yaml:snakeyaml:1.26,依赖管理声明自spring-boot-dependencies
Maven: org.yaml:snakeyaml:android:1.23,从其他依赖透明传递下来

snakeyaml.jar

5.使用Arthas命令确认已加载的类信息和方法信息

class/classloader 相关

破案杀手锏

  • sc - 查看 JVM 已加载的类信息
  • sm - 查看已加载类的方法信息
[arthas@41915]$ sc -d org.yaml.snakeyaml.constructor.SafeConstructor
 class-info        org.yaml.snakeyaml.constructor.SafeConstructor
 code-source       /Users/lihuagang/.m2/repository/org/yaml/snakeyaml/1.23/snakeyaml-1.23-android.jar
 name              org.yaml.snakeyaml.constructor.SafeConstructor
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       SafeConstructor
 modifier          public
 annotation
 interfaces
 super-class       +-org.yaml.snakeyaml.constructor.BaseConstructor
                     +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@18b4aac2
                     +-sun.misc.Launcher$ExtClassLoader@4d95d2a2
 classLoaderHash   18b4aac2

Affect(row-cnt:2) cost in 34 ms.


[arthas@41915]$ sm org.yaml.snakeyaml.constructor.SafeConstructor <init>
org.yaml.snakeyaml.constructor.SafeConstructor <init>()V

Affect(row-cnt:2) cost in 55 ms.

[arthas@41915]$ sm -d org.yaml.snakeyaml.constructor.SafeConstructor <init>
 declaring-class   org.yaml.snakeyaml.constructor.SafeConstructor
 constructor-name  <init>
 modifier          public
 annotation
 parameters
 exceptions
 classLoaderHash   18b4aac2

sc -d org.yaml.snakeyaml.constructor.SafeConstructor

sm org.yaml.snakeyaml.constructor.SafeConstructor

  • 通过sc -d org.yaml.snakeyaml.constructor.SafeConstructor,可以看到其加载自snakeyaml-1.23-android.jar
  • 通过sm org.yaml.snakeyaml.constructor.SafeConstructor <init>,可以看到没有org.yaml.snakeyaml.constructor.SafeConstructor#SafeConstructor(org.yaml.snakeyaml.LoaderOptions)构造函数的方法签名。
  • 综上所述,与异常信息完全符合。

6.解决方法

snakeyaml-1.23-android.jar依赖排除掉,搞定。


祝大家玩得开心!ˇˍˇ

广益,杭州

<think>好的,我现在需要帮助用户了解如何使用Arthas工具进行Java诊断,特别是如何启动和操作arthas-boot.jar。用户之前已经提过相关问题,现在需要更详细的步骤和注意事项。我需要参考用户提供的引用内容,尤其是引用[1]、[2]、[3]中的信息,确保回答准确。首先,用户提到下载arthas-boot.jar是通过curl命令,然后使用java -jar启动。但用户也遇到了问题,比如openjdk环境下的tools.jar缺失问题,以及boot包的结构导致端口占用的问题。我需要将这些注意事项整合到回答中,避免用户遇到同样的问题。 接下来,启动流程部分需要详细说明,包括选择目标进程PID,以及启动后的命令操作。用户可能对如何选择PID不太清楚,需要给出例子,比如使用ps命令查找Java进程。同时,引用[3]提到boot只是调用核心包,所以端口占用问题可能需要用户检查其他进程,这部分需要提醒用户。然后,常用命令部分需要列举几个核心功能,如dashboard、thread、jad等,并给出示例。每个命令的作用和用法要简明扼要,方便用户快速上手。同时,用户可能关心权限问题,引用[4]提到权限匹配,所以需要强调执行用户权限要与目标进程一致,避免连接失败。注意事项部分要包括生产环境的谨慎操作,比如redefine命令的风险,以及日志查看的位置。引用[4]提到日志路径,需要指出如何排查连接问题。此外,tools.jar的问题在引用[2]中提到,需要指导用户如何解决,比如拷贝tools.jar到jre目录。最后,生成相关问题需要考虑用户可能进一步的需求,比如诊断线程池阻塞、内存泄漏分析,以及与其他工具的区别。这些问题需要基于之前的回答内容,确保相关性和实用性。 现在需要组织这些信息,结构清晰,分步骤说明,并加入引用标记。确保语言通俗易懂,避免技术术语过多,但保持专业性。同时,检查LaTeX格式是否符合要求,数学表达式是否正确使用$符号,但用户的问题中可能不涉及数学公式,所以这部分可能不需要。不过示例中的代码块要正确格式化,使用bash语法高亮,并给出具体命令示例。 总结步骤:下载启动、选择PID、常用命令、注意事项、相关问题。每个部分都要参考引用内容,确保准确性和解决用户可能遇到的问题。</think>### 如何使用Arthas工具进行Java诊断? #### 一、启动与连接流程 1. **下载与启动** - 通过`curl`命令下载Arthas核心包: ```bash curl -O https://arthas.aliyun.com/arthas-boot.jar # 下载Arthas启动器[^1] ``` - 启动Arthas并选择目标Java进程: ```bash java -jar arthas-boot.jar # 启动后显示可用进程列表,输入PID序号选择目标进程[^3] ``` 2. **常见启动问题处理** - **OpenJDK环境问题**:若报错提示缺少`tools.jar`(常见于仅安装JRE的OpenJDK环境),需从相同版本JDK的`lib`目录下复制`tools.jar`到当前JRE的`lib`目录[^2]。 - **端口占用问题**:Arthas默认使用`3658`端口,若端口被占用,需手动关闭冲突进程或通过`telnet`模式连接[^3]。 --- #### 二、核心操作步骤 1. **选择目标进程** 启动后,控制台会列出当前所有Java进程,例如: ``` [1] 12345 com.example.App [2] 67890 org.springboot.Main ``` 输入对应序号(如`1`)即可附加到目标进程。 2. **常用诊断命令** - **实时监控面板**: ```bash dashboard # 查看JVM内存、线程、GC等实时状态[^1] ``` - **线程分析**: ```bash thread 22 # 查看ID为22的线程的详细堆栈 thread -b # 快速定位阻塞/死锁线程[^1] ``` - **反编译类文件**: ```bash jad com.example.Service # 动态反编译指定类,验证代码版本[^1] ``` - **方法调用追踪**: ```bash trace com.example.Service getUserInfo # 追踪方法内部调用链及耗时[^1] ``` 3. **权限与连接问题** - 若连接失败,需确保执行用户与目标Java进程的权限一致(例如使用`sudo -u [user]`启动)。 - 检查日志文件`~/logs/arthas/arthas.log`排查连接错误[^1]。 --- #### 三、注意事项 1. **生产环境操作规范** - 避免频繁使用`redefine`热更新命令,可能导致类加载冲突或内存泄漏。 - 通过`stop`命令退出Arthas时,不会影响目标Java进程的运行[^3]。 2. **环境依赖** - **JDK版本匹配**:确保Arthas版本与目标Java进程的JDK版本兼容(支持JDK 6+)。 - **网络隔离**:若服务器限制外网访问,需提前下载完整Arthas离线包部署[^1]。 --- #### 四、操作示例 ```bash # 步骤1:下载并启动 curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar # 步骤2:选择PID为12345的进程 [INFO] arthas-boot version: 3.6.7 [INFO] Found existing java process, please choose one and input the serial number: 1. 12345 com.example.App 2. 67890 org.springboot.Main Input selection: 1 # 输入目标进程序号 # 步骤3:执行诊断命令 arthas@12345$ dashboard # 查看实时监控 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简放视野

深度思考,简放视野。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值