title: 奇闻异事之NoSuchMethodError tags:
- NoSuchMethodError
- maven categories: 工作日志 date: 2017-12-05 22:09:37
背景
今天小伙伴开发碰到一个问题,在本地环境IDE调不通新发布的rpc接口中的新加的method
报错NoSuchMethodError
即使重启IDE也无法掉通
由于现场已经不存在 就不贴详细的报错堆栈了
思路
- NoSuchMethodError偏向于该方法不存在那么可能是远程rpc未发布新的接口?
- 项目采用maven,报NoSuchMethodError的是公司内部方法不存在版本冲突【初步排除版本冲突】
由于思路2被排除那么就只能思考是否是远程没有发布 于是通过查看rpc的工具真是服务端确实发布了该方法
并且发现其他客户端成功调用了同一个服务端的对应接口方法【为排除配置错误 比如连上了不同版本 不同ip的服务】
调查一度陷入了僵局
既然排除了思路1 那根据福尔摩斯所说【排除一切不可能的,剩下的即使再不可能,那也是真相】 当然一切不可能也只是所学知识范围内的不可能而已
于是继续考虑思路2
怀疑是否存在同一个类在classpath中
通过访问对应web的target目录 发现确实存在两个不同版本的接口包
此时问题了然!确实是由于同一个class在不同版本中存在导致 大家知道这是典型的jar冲突!
那么在使用maven的时候同样的GA为何没有被自动选择呢?
猜测如下:
开发者在更新pom文件时并没有关闭当前应用由于重新import pom时不能需要删除旧版本的jar同时引入新版本的jar
但是由于当前应用正在运行 java进程占用了旧版本的jar导致maven reimport时无法删除旧版本jar【未通过maven命令而是IDE的GUI reimport操作】
那么此时classpath中就存在了两个不同版本的jar 即使关闭当前应用重启也不能删除就旧版本jar 需要mvn clean之后重新运行
由于ide也引入了新的jar 因此编译也不会报错 只是在运行时实际存在两个不同的jar
通过和对应开发沟通发现确实如此 通过clean命令后应用可以正常调用!