一次排查axis2的NoSuchMethodError的过程(附Tomcat的jar包加载顺序)

昨日上线遇到一个很严重的问题,某些机器报NoSuchMethodError错误,但集群中有些机器又不报。错误如下:
错误
这个错误意思是调用TransportUtils#doWriteMTOM方法,而方法不存在导致。看到此错误立马反应过来,可能是多个jar包中存在TransportUtils类,而不同版本其方法签名又不完全一样导致。于是去搜TransportUtils,结果发现只有一个TransportUtils。又是就在风中凌乱。在这里插入图片描述
在风中凌乱了半个小时后,突然意识到可能是上级调用TransportUtils的类可能存在于多个jar包中。于是再次查看异常堆栈,发现其调用方CommonsHTTPTransportSender果然存在于两个jar中。
在这里插入图片描述
这两个jar是通过离线jar导入的方式导入的,未采取maven或者gradle这种版本管理工具管理。
在这里插入图片描述
axis2-transport-http-1.6.2.jar 中的 CommonsHTTPTransportSender#invoke方法中果然使用到了TransportUtils#doWriteMTOM,而TransportUtils来自axis2-kernel-1.4.1.jar,不存在该方法。
在这里插入图片描述
axis2-kernel-1.4.1.jar改为axis2-kernel-1.6.2.jar 即可解决了此问题。
于是再次测试,又发现另外一个错误。!!!再次在风中凌乱。
在这里插入图片描述
但万变不离其宗,再次搜索此类:org.apache.neethi.Constants
在这里插入图片描述
在neethi-2.0.4.jar中不存在isPolicyElement方法导致。这两个jar也是通过离线手工方式导入,删除低版本的即可。经过测试没问题后上线。

以上就是排查NoSuchMethodError错误的全过程,至于为什么Tomcat加载jar的顺序又是另外一个话题,可参见:
https://blog.51cto.com/u_15535797/6075882
https://blog.csdn.net/fenglllle/article/details/122419712

为什么集群中有些机器报错,有些机器不报错呢?以下的文章可以很好地回答这个问题。
https://www.cnblogs.com/interdrp/p/15601119.html
https://blog.csdn.net/fenglllle/article/details/122419712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值