升级至Sbt 1.7.1后编译循环无限执行问题求助
解决sbt 1.6+/1.7.1无限编译循环问题
环境信息
- Windows 10 64bit
- sbt 1.7.1
- Scala 2.13.8
问题现象
将sbt从1.3.13升级到1.7.1(或1.6.2及以上版本)后,在IntelliJ中修改类文件后执行sbt compile/sbt test/sbt run会陷入无限编译循环,重复输出编译7个Scala源文件、15/22个Java源文件的日志;仅执行sbt clean后再运行命令能正常完成。低版本sbt(1.3.13/1.4.9/1.5.8)无此问题。
解决方案
1. 修复文件系统时间戳与编辑器安全写入问题
Windows环境下,sbt 1.6+的文件变更检测逻辑对时间戳更敏感,可调整以下设置:
- 确认项目文件的修改时间与系统时间一致,无时间回退或异常情况
- 关闭IntelliJ的「安全写入」功能:进入
File > Settings > Appearance & Behavior > System Settings,取消勾选Use "safe write" (save changes to temporary file first),避免编辑器保存时生成临时文件触发sbt重复检测变更
2. 调整sbt文件监听策略
在项目build.sbt中添加配置,适配Windows环境的监听逻辑:
// 触发编译时清空之前的监听日志提示 ThisBuild / watchTriggeredMessage := Watch.clearWhenTriggered // 降低监听日志级别,减少冗余输出 ThisBuild / watchLogLevel := Level.Warn // 强制使用轮询模式(Windows部分场景下比原生监听更稳定) ThisBuild / watchService := Watched.WatchService.Polling
3. 排查编译时修改源文件的逻辑
检查项目是否存在编译过程中修改源目录文件的操作(如自动格式化工具、代码生成插件),这类操作会触发sbt变更检测导致循环:
- 禁用编译时自动格式化或修改源文件的插件/逻辑
- 若需保留代码生成,将生成文件输出到
target目录而非源目录,并标记为生成源:
Compile / sourceGenerators += Def.task { val outputDir = (Compile / sourceManaged).value / "generated" // 此处替换为你的代码生成逻辑,输出文件到outputDir Seq(outputDir / "GeneratedClass.scala") }.taskValue
4. 临时降级sbt版本
若上述方案无效,可暂时降级到sbt 1.5.8(该版本无循环问题),同时等待sbt官方修复Windows环境下的兼容性问题。
内容的提问来源于stack exchange,提问作者capo11
相关产品推荐
相关产品推荐

