昨日上线遇到一个很严重的问题,某些机器报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