sbt 1.4.4下升级Scala至2.13.x时scripted-plugin依赖下载失败问题解决
问题根因与解决方案
核心触发原因
- sbt 1.4.4 版本的所有官方配套核心组件(包括
scripted-plugin),仅发布了适配Scala 2.12的制品,从未发布过Scala 2.13编译的1.4.4版本scripted-plugin包。你在开了sbtPlugin := true的项目里把全局scalaVersion改成2.13.x时,sbt的%%依赖匹配规则会自动给依赖名称追加当前项目的Scala版本后缀,直接解析scripted-plugin_2.13:1.4.4,自然在所有仓库都检索不到对应制品。 - 尝试直接关闭ScriptedPlugin时的未定义设置报错,来自两个来源:一是你在项目settings里硬编码了
scriptedLaunchOpts配置项,这个配置只有ScriptedPlugin被启用时才会被注册到sbt的配置表中;二是你引入的sbt-giter8 0.11.0插件的g8Test任务,会强制引用scriptedLaunchOpts、scriptedBufferLog两个由ScriptedPlugin提供的配置值,插件被移除后配置自然处于未定义状态,触发sbt的校验报错。 - 容易被忽略的配置规则:开启
sbtPlugin := true的项目,用来编译sbt插件代码的Scala版本,不能脱离当前sbt运行时内置的Scala版本自由配置。sbt 1.4.x的运行环境固定绑定Scala 2.12.x,强行把插件项目的全局Scala版本改到2.13.x,就算绕开了scripted-plugin的依赖报错,后续插件加载、类路径扫描阶段也会出现类版本不兼容的运行时故障。
可落地的升级路径(目标:业务代码Scala版本升级至2.13.4)
你当前项目是插件配置和业务代码耦合的混合结构,直接改全局Scala版本必然触发上述兼容问题,按以下步骤调整即可:
- 拆分Scala版本的配置边界
- 根项目(插件编译模块)保留全局
scalaVersion为2.12.12,匹配sbt 1.4.4的运行时要求,此时scripted-plugin的依赖会自动匹配_2.12的已发布版本,不再触发下载失败报错。 - 新建独立的业务代码子模块,在该子模块的settings里单独设置
scalaVersion := "2.13.4",把原来堆在根项目里的AWS SDK、Twilio、数据库连接池、play-json等所有业务依赖全部迁移到这个子模块下,实现插件编译和业务代码编译的Scala版本隔离。
- 根项目(插件编译模块)保留全局
- 修复ScriptedPlugin相关的配置报错
- 不要直接移除
ScriptedPlugin的启用,保持插件默认加载状态,这样scriptedLaunchOpts、scriptedBufferLog两个配置项会被正常注册,sbt-giter8插件的任务也能正常引用这些配置,不会出现未定义错误。 - 如果你确实不需要scripted的脚本测试功能,不需要硬关插件,只需要注释掉自定义的
scriptedLaunchOpts配置,同时升级sbt-giter8到不强制依赖ScriptedPlugin的兼容版本即可。
- 不要直接移除
- 清理旧缓存验证构建
- 构建前清理本地Ivy缓存中残留的失败解析记录,删除
~/.ivy2/cache/org.scala-sbt/scripted-plugin目录下的旧缓存,避免旧的解析状态导致的反复报错。 - 依次执行
sbt update、sbt compile验证:根模块的插件依赖正常解析2.12版本的scripted-plugin,业务子模块正常拉取所有2.13版本的Scala依赖,完成整体构建流程。
- 构建前清理本地Ivy缓存中残留的失败解析记录,删除
避坑提醒
- 不要为了适配Scala 2.13强行跨大版本升级sbt:sbt 1.5.x及以上版本才将核心组件的Scala编译版本迁移到2.13,在sbt 1.4.4的版本下,拆分模块做Scala版本隔离是唯一不触发兼容问题的方案。
- 所有带
%%后缀的依赖会自动匹配对应模块的Scala版本,不需要手动给依赖加版本后缀,避免出现重复解析、版本不匹配的问题。
内容的提问来源于stack exchange,提问作者Techmag
相关产品推荐
相关产品推荐

