← 中文资源

简体中文版本

Java 变更依赖后运行时抛 NoSuchMethodError

通过发现导致加载到错误类的重复依赖版本,修复 NoSuchMethodError。

阅读英文原文

症状

应用编译成功却运行时抛出 NoSuchMethodError,并指出源码明确调用的方法。该方法在某版本库中存在、在另一版本中不存在,而运行时因类路径上出现两个版本而加载了错误的 jar。这是类路径冲突,不是代码错误,改调用代码无济于事。

诊断

用 dependency:tree 查看是否有多版本;用 -verbose:class 确认类来自哪个 jar;通过 exclude 或版本锁定只留一个版本。

mvn dependency:tree -Dincludes=group:artifact

根因

运行时加载的类来自与编译时不同的库版本,因此源码中有的方法在加载到的类里不存在。

修复

通过排除不需要的传递版本或统一依赖管理锁定一个版本来解决冲突,再重新构建使编译与运行类路径一致。

验证

运行应用确认方法可解析,再检查依赖树确认只剩一个版本。版本唯一且调用可用才算修好。

常见陷阱

把依赖降级到运行时版本会让源码使用的新 API 无法编译;应统一到同一版本。