IntelliJ Gradle插件编译Scala报sbt.internal.io.Milli初始化错误
问题根因
这个报错和项目代码、Gradle配置无关,是IntelliJ构建时的类加载冲突导致的:
IntelliJ调用内置Gradle插件执行构建时,会自动把自身Scala插件携带的sbt、zinc编译依赖注入到Gradle守护进程的类加载路径,且这部分依赖的加载优先级高于项目通过Gradle拉取的依赖。当IntelliJ Scala插件内置的sbt.io版本和项目Gradle Scala插件依赖的sbt版本不兼容时,就会触发sbt.internal.io.Milli类静态初始化失败。终端直接执行./gradlew时不会加载IntelliJ注入的额外依赖,所以构建可以正常跑通。
修复步骤
按以下顺序操作,绝大多数同类问题都能解决:
- 调整Gradle运行配置:打开
Settings > Build, Execution, Deployment > Build Tools > Gradle,把Build and run using、Run tests using两个选项从默认的IntelliJ IDEA改成Gradle,强制所有构建流程走Gradle原生链路,不让IntelliJ用自身的编译逻辑接管构建。 - 彻底清理缓存:不要只用IDEA界面上的
Invalidate Caches功能,它的清理范围不全:- 关闭IntelliJ,删除项目根目录下的
.idea文件夹,以及所有子模块下的build、.out编译输出目录 - 删除IntelliJ全局缓存目录,不同系统对应路径:
- macOS:
~/Library/Caches/JetBrains/IntelliJIdea<当前安装的IDEA版本号> - Windows:
%LOCALAPPDATA%\JetBrains\IntelliJIdea<当前安装的IDEA版本号>\caches - Linux:
~/.cache/JetBrains/IntelliJIdea<当前安装的IDEA版本号>
- macOS:
- 重新打开IntelliJ导入项目
- 关闭IntelliJ,删除项目根目录下的
- 回退Scala插件版本:如果上面两步操作后还是报错,说明当前Scala插件版本和你用的Gradle 6.6.1版本不兼容。打开
Settings > Plugins找到Scala插件,点击齿轮图标选择回退,降到2023.1.x系列的稳定版即可——新版本Scala插件内置的sbt依赖版本太高,和Gradle 6.x自带的Scala编译链存在已知兼容性问题。 - 兜底配置:打开Gradle工具窗口的设置页,勾选
Do not build IDEA project classes automatically,重启IDEA后先在终端执行一次./gradlew clean build确认构建正常,再从IDEA面板触发构建。
报错核心堆栈参考
Task :dataset:compileScala ## Exception when compiling 133 sources to /Users/jh/0_code/alpine-knowledge/alpine-dataset/.out/classes/scala/main java.lang.NoClassDefFoundError: Could not initialize class sbt.internal.io.Milli$ sbt.io.IO$.$anonfun$getModifiedTimeOrZero$1(IO.scala:1373) scala.runtime.java8.JFunction0$mcJ$sp.apply(JFunction0$mcJ$sp.java:23) sbt.internal.io.Retry$.liftedTree2$1(Retry.scala:38) sbt.internal.io.Retry$.impl$1(Retry.scala:38) sbt.internal.io.Retry$.apply(Retry.scala:52) sbt.internal.io.Retry$.apply(Retry.scala:24) sbt.io.IO$.getModifiedTimeOrZero(IO.scala:1373) sbt.internal.inc.caching.ClasspathCache$.fromCacheOrHash$1(ClasspathCache.scala:44) sbt.internal.inc.caching.ClasspathCache$.$anonfun$hashClasspath$1(ClasspathCache.scala:53) scala.collection.parallel.mutable.ParArray$Map.leaf(ParArray.scala:659) scala.collection.parallel.Task.$anonfun$tryLeaf$1(Tasks.scala:53) scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) scala.util.control.Breaks$$anon$1.catchBreak(Breaks.scala:67) scala.collection.parallel.Task.tryLeaf(Tasks.scala:56) scala.collection.parallel.Task.tryLeaf$(Tasks.scala:50)
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

