IntelliJ 2018.1中Java项目出现NoSuchMethodError问题求助
解决Java/Spring/Gradle项目中的NoSuchMethodError问题
这种java.lang.NoSuchMethodError在多模块Gradle项目里真的是常客,我来帮你梳理下最可能的原因和解决办法:
先清缓存,彻底构建
Gradle和IntelliJ都有各自的缓存,有时候旧的class文件顽固残留,改了代码也白搭。先试试:- 用Gradle命令彻底清理:在项目根目录执行
./gradlew clean build(Windows系统用gradlew.bat clean build),把旧的构建产物和缓存全清掉再重新编译。 - 清IntelliJ的IDE缓存:点击
File -> Invalidate Caches / Restart...,选择Invalidate and Restart,让IDE彻底刷新缓存。
- 用Gradle命令彻底清理:在项目根目录执行
检查测试代码和反射/注入点
别笑,很多时候主类改了构造,但测试代码没同步!- 全局搜索测试类里所有
new MyClass(...)的代码,看看是不是还在传4个参数,漏掉了新增的lastFour参数。 - 如果是用Spring注入、JPA实体、JSON序列化这类场景创建实例,也要检查这些地方:比如XML配置里的构造注入参数、
@Bean方法里的实例化代码、或者序列化框架(比如Jackson)的配置,有没有还在依赖旧构造的情况。
- 全局搜索测试类里所有
排查多模块依赖的同步问题
如果这个MyClass所在的模块被其他模块依赖,得确保依赖方拿到的是最新版本:- 针对依赖它的模块,执行
./gradlew :依赖模块名:compileJava,强制它重新编译并拉取最新的MyClass类文件。 - 查看Gradle依赖树,确认有没有意外引入旧版本的这个模块:执行
./gradlew dependencies,搜索MyClass所在模块的名称,排除掉可能的旧版本依赖。
- 针对依赖它的模块,执行
对齐IntelliJ和Gradle的构建配置
有时候IntelliJ用自己的内置构建系统,和Gradle的状态不一致:- 打开
Settings -> Build, Execution, Deployment -> Build Tools -> Gradle,把Build and run using和Run tests using都设置为Gradle,确保IDE完全用Gradle来管理构建和测试。 - 点击右上角的
Sync Project with Gradle Files按钮,同步IDE和Gradle的配置状态。
- 打开
检查测试的类路径
看看测试运行的类路径里有没有混入旧文件:
打开测试的Run Configuration,检查Classpath标签页,有没有手动添加的旧lib目录或者jar包,这些可能会覆盖Gradle管理的最新类文件。
如果以上步骤都试过还是没解决,那可能要排查下有没有字节码增强工具(比如Lombok、Spring AOP)或者代理类修改了这个类的构造方法,但大部分情况下,上面的方法应该能搞定这个问题。
内容的提问来源于stack exchange,提问作者sonoerin
相关产品推荐
相关产品推荐

