IntelliJ运行Scala脚本报错求助:父模块执行失败子模块正常
我之前刚好踩过这个坑!这个NoSuchMethodError本质上是Scala版本不兼容搞出来的——尤其是编译器版本和运行时依赖的版本对不上,而子模块刚好继承了正确的配置,父模块的配置出了问题,就会出现这种“同项目不同模块表现不一样”的诡异情况。
下面是我亲测有效的解决步骤:
检查父模块的Scala SDK配置
打开IntelliJ的File > Project Structure,依次查看Libraries和Global Libraries,确认父模块使用的Scala SDK版本和子模块完全一致。很多时候父模块会不小心用了和子模块不同的Scala版本(比如子模块用2.13.x,父模块残留了2.12.x的SDK),导致方法签名不匹配,触发这个错误。统一父/子模块的Scala依赖版本
如果是用SBT管理项目,一定要在父项目的build.sbt里统一声明Scala版本,比如:ThisBuild / scalaVersion := "2.13.10"子模块不要单独指定不同的版本,避免依赖冲突。另外可以用
sbt dependencyTree命令查看依赖树,排查是否混入了不同版本的scala-compiler或scala-reflect,如果有就用exclude规则排除掉冲突的版本。修正Scala脚本的运行配置
打开右上角运行按钮旁的下拉框,选择Edit Configurations,找到对应的Scala脚本配置:- 确认
Use classpath of module选的是父模块; - 检查
Scala SDK是否为项目统一的版本,不要用全局的旧版本SDK。
有时候IntelliJ会默认加载全局SDK,导致运行时版本和编译版本不匹配。
- 确认
清理IntelliJ缓存并重启
这是解决IntelliJ各种奇怪问题的终极大招:File > Invalidate Caches... > Invalidate and Restart。缓存里的旧依赖信息经常会导致运行时加载错误的类文件,清理后大概率能解决问题。
另外补充一个特殊场景:如果你的父模块是聚合项目(仅用来管理子模块,本身没有Scala代码),那父模块可能没有正确引入Scala SDK,这时候给父模块添加Scala SDK依赖就能解决问题。
核心总结:这个错误90%以上都是编译时、运行时、IntelliJ配置的Scala版本不一致导致的,把所有地方的版本统一就能搞定。
内容的提问来源于stack exchange,提问作者digitebs

