开发环境,NoSuchMethodError异常原因排查和解决
1 问题描述
开发环境,苍穹日志出现NoSuchMethodError异常。以下图为例,com.alibaba.dubbo.config.ProviderConfig报错,其setInstanceId方法没有找到。
2 整体思路
(1)根据异常堆栈,找到全限定名(包名+类名)
(2)idea编辑器中,双击shift,全局搜索类文件,查找类冲突的jar包
(3)解决方式:如果确认是类冲突,可以在gradle中,配置加载顺序。java类加载器遵循 首次加载原则,让正确的类被首次加载,即可解决问题。
3 排查流程案例
以上述异常为例,详细排查流程如下
(1)根据上图的调用堆栈可以得知,DubboBeanManager在调用ProviderConfig的setInstanceId方法时,抛出了NoSuchMethodError异常。
(2)查找DubboBeanManager的import,发现引入了com.alibaba.dubbo.config.ProviderConfig这个类
(3)idea编辑器中,双击shift,全局搜索类文件,发现存在两个com.alibaba.dubbo.config.ProviderConfig类,但是所在的jar包不一样。一个在bos-mservice-dubbox-1.0.jar,另一个在dubbo-2.8.4.jar
(4)对比两个ProviderConfig,发现bos-mservice-dubbox-1.0.jar里面的ProviderConfig有setInstanceId方法,而
dubbo-2.8.4.jar里面的ProviderConfig则没有。
4 原因分析
在启动苍穹时,优先加载了dubbo-2.8.4.jar,DubboBeanManager在调用时,调用了dubbo-2.8.4.jar里面的ProviderConfig。
5 解决方法
这种jar包冲突问题,是java开发过程中,比较常见,特别是在依赖的jar包非常多的情况下。
(1)检查依赖顺序,让bos最先被加载。查看build.gradle,查看dependencies顺序,把bos-mservice-dubbox-1.0.jar所在的bos目录,放在dependencies第一行,让bos下面的jar包优先被加载。
(2)修改了build.gradle文件,需要刷新gradle依赖。
(3)重启cosmic
开发环境,NoSuchMethodError异常原因排查和解决
本文2024-09-23 01:14:56发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144735.html