由NoSuchMethodError引发的血案

1、背景

最近在工作的过程中遇到了一个NoSuchMethodError错误,从名字上来看这个异常就是说,代码中没有这个方法;异常的全名是: java.lang.NoSuchMethodError,利用周末的时间来记录一下。

2、历程

异常信息的关键部分如下:

Caused by: java.lang.NoSuchMethodError: org.apache.commons.collections.MapUtils.isEmpty(Ljava/util/Map;)Z

从异常的字面意思上理解还是很容易的,运行的类中没有isEmpty方法。But,我们项目引用的commons包的版本是3.2.2的呀,代码报错的地方也直接就进入到相应的方法了,这个方法是存在的,没毛病的;

那是什么原因导致代码在运行时找不到这个类方法呢?想到这,我突然想到项目新引入了tbschedule的依赖包,会不会是tbschedule中的jar包和项目中的jar包冲突呢?

想到这,就在控制台敲入了[mvn dependency:tree]命令。这个命令是用来查看maven的包依赖树的。果不其然,在tbschedule依赖的commons-beanutils-core包中也依赖了commons-collections,只不过tbschedule依赖的版本是2.0,而2.0的版本确实没有这个方法。

既然知道原因,那么解决起来就非常容易了,将低版本的jar包排除掉即可。排出后,再次运行程序,程序一切正常。

3、总结

这个异常处理起来还是很简单,一般都是因为包冲突引起的,主要是如何定位到哪个包的依赖;使用[mvn dependency:tree]命令可以打印出所有的包依赖,根据依赖关系做排除就好了。

posted @ 2020-07-26 19:12  一平超凡  阅读(419)  评论(0)    收藏  举报