java.lang.NoSuchMethodError

最近在线上报了一个case:商户删除报价单之后,商户后台仍然显示已删除的报价单

查询数据库得知,报价单已经删除成功(软删除),所以问题的原因是redis缓存没有执行删除操作,查看删除操作对应的接口,删除数据库和redis缓存是2行相邻的代码,按理来说,这2个操作必定是同时都执行或者不执行,现在的结果却是只执行了其一,百思不得解。

想起来之前该项目做过redis迁移,应该与此有关,最终得到的结果是,项目的依赖问题,原项目依旧依赖的之前的biz,所以删除操作依旧在对memcache缓存进行删除,导致redis缓存依旧存在。解决的办法也很简单,把依赖的biz版本升级即可。

这个case告一段落,但是有遇到了一个新的问题,单元测试的时候出现异常:

Caused by: java.lang.NoSuchMethodError: com.dianping.lion.client.region.RegionManager.getLocalCenter()Ljava/lang/String;
at com.dianping.zebra.group.router.region.LionRegionManager.<init>(LionRegionManager.java:28)
at com.dianping.zebra.group.router.region.LionRegionManager.getInstance(LionRegionManager.java:16)
at com.dianping.zebra.group.router.region.ZebraRegionManagerLoader.getRegionManager(ZebraRegionManagerLoader.java:12)
at com.dianping.zebra.group.router.RegionAwareRouter.<init>(RegionAwareRouter.java:29)
at com.dianping.zebra.group.router.BackupDataSourceRouter.<init>(BackupDataSourceRouter.java:19)
at com.dianping.zebra.group.datasources.LoadBalancedDataSource.init(LoadBalancedDataSource.java:158)
at com.dianping.zebra.group.jdbc.GroupDataSource.initDataSources(GroupDataSource.java:507)
at com.dianping.zebra.group.jdbc.GroupDataSource.initInternal(GroupDataSource.java:528)
at com.dianping.zebra.group.jdbc.GroupDataSource$3.initGroupDataSource(GroupDataSource.java:423)
at com.dianping.zebra.filter.DefaultJdbcFilter.initGroupDataSource(DefaultJdbcFilter.java:84)
at com.dianping.zebra.group.jdbc.GroupDataSource$3.initGroupDataSource(GroupDataSource.java:421)
at com.dianping.zebra.filter.DefaultJdbcFilter.initGroupDataSource(DefaultJdbcFilter.java:84)
at com.dianping.zebra.group.jdbc.GroupDataSource$3.initGroupDataSource(GroupDataSource.java:421)
at com.dianping.zebra.filter.DefaultJdbcFilter.initGroupDataSource(DefaultJdbcFilter.java:84)
at com.dianping.zebra.group.jdbc.GroupDataSource$3.initGroupDataSource(GroupDataSource.java:421)
at com.dianping.zebra.monitor.filter.CatFilter.initGroupDataSource(CatFilter.java:217)
at com.dianping.zebra.group.jdbc.GroupDataSource$3.initGroupDataSource(GroupDataSource.java:421)
at com.dianping.zebra.group.jdbc.GroupDataSource.init(GroupDataSource.java:427)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1414)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1375)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
... 79 more


这个问题也是比较奇怪,因为上周我还运行的好好的,期间好像也没改动什么东西。只能查看报错信息了;

信息提示:java.lang.NoSuchMethodError: com.dianping.lion.client.region.RegionManager.getLocalCenter(),也是是说,找不到getLocalCenter()这个方法,于是,我们先搜索一下对应的jar包:


我们可以看到总共有5个jar包,初步猜测,出现异常的原因就是jar包冲突的问题。

接下来查看pom文件中jar包的依赖关系:


pom文件中依赖的是0.6.7版本的"lion-client" jar包,我们打开这个jar包,发现其中确实没有getLocalCenter()这个方法,猜测应该是jar包版本过低导致,我们升级jar包版本,重新运行单元测试,问题得到解决。

问题解决了,但是疑问还是有的,是什么样的操作导致这个异常呢?我们从报错信息中看的:at com.dianping.zebra.group.router.region.LionRegionManager.<init>(LionRegionManager.java:28),zebra这个包出现问题,在pom文件中查询这个包,打开Annotations,发现果然这个包在前几天被人改动过,我们打开这个包的pom文件,查询包中lion-client的版本,依赖的版本是0.7.8。而我们此前依赖的是0.6.7,所以出现报错,出现问题的原因我们也找到了。接下来我们再深究一些。

在maven的pom文件中,jar包的依赖是存在优先级的:

1.该项目pom文件中直接dependency的jar包

2.该项目的parent中依赖的jar包

3.该项目依赖的jar包中依赖的jar包


我们来模拟一下本次报错的过程:

(模拟过程不严谨哈~)当前项目记为A

1.初始状态,A中依赖了2个jar包:(简写为)lion(版本为0.0.1,此版本中没有get方法)和zebra(版本为0.0.1),并且zebra中也依赖了lion(版本0.0.1)。此阶段一切运行正常

2.某个时期,lion进行更新,添加了get方法,版本升级到了0.0.2,接下来,他在zebra中升级了lion的版本(0.02),并且使用了get方法。此时运行zebra正常,同时,他发现A中依赖了zebra,于是在A中升级zebra版本为0.0.2。我们发现,他并没有升级A中的lion 版本(依旧为0.0.1),此时运行A就会出现上面的异常,因为根据优先级,运行A时,A中pom文件中的lion(0.0.1)包优先级最高,由于zebra已经升级使用了get方法,但是0.0.1的lion中没有get方法,所以报错了。


彻底弄清楚问题的原因之后,总结一下:

此异常出现的原因主要是jar包优先级和没有及时更新jar包版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值