SBT 1.9.7无法获取最新SNAPSHOT依赖,如何解决?
问题:SBT 1.9.7无法下载最新SNAPSHOT依赖
- 此前看到Stack Overflow相关问题的评论提到:无需将SNAPSHOT依赖标记为
changing(),SBT已配置Ivy自动识别快照包更新 - 使用SBT 1.9.7版本,执行
test和show externalDependencyClasspath后,发现仍引用过期的SNAPSHOT jar包,该jar位于~/Library/Caches/Coursier/v1/https/目录 - 推测Coursier不支持Ivy的自动识别快照更新特性,或Ivy配置未应用到Coursier
- 已尝试删除缓存目录、在依赖声明中添加/移除
changing()、多次执行sbt update,均无法让SBT使用最新依赖版本,且已确认Nexus服务器上存在新版本快照包 - 需求:如何让SBT下载最新的SNAPSHOT版本?
解决方案
1. 强制Coursier更新快照包
SBT 1.9+默认使用Coursier作为依赖管理工具,它的SNAPSHOT更新逻辑和Ivy不同,可直接执行强制更新命令:
sbt "dependencyUpdates; update"
或者针对性强制刷新所有快照依赖:
sbt update -SNAPSHOT
若只需更新特定模块,可指定模块信息:
sbt "update 你的组名::你的Artifact名"
2. 配置Coursier的快照更新策略
在build.sbt或全局配置文件~/.sbt/1.0/global.sbt中添加以下配置,强制Coursier每次构建都检查远程仓库的最新快照版本:
import coursier.core.Snapshot ThisBuild / coursierSnapshotUpdatePolicy := Snapshot.UpdatePolicy.Always
3. 清理特定快照的Coursier缓存
无需删除全部缓存,可精准删除对应快照的缓存文件,示例命令:
rm -rf ~/Library/Caches/Coursier/v1/https/你的Nexus域名/你的组名/你的Artifact名/快照版本号/
执行后再运行sbt update即可。
4. 检查Nexus快照元数据
确认Nexus上的SNAPSHOT包元数据(如maven-metadata.xml)已更新。如果元数据未同步,Coursier会认为本地缓存的版本是最新的。可直接访问Nexus对应快照路径查看元数据文件,确认其中的版本和文件信息是最新状态。
5. 临时切换回Ivy依赖管理
若Coursier相关方案无效,可临时切换回Ivy:
- 在
project/plugins.sbt中添加插件:
addSbtPlugin("org.scala-sbt" % "sbt-ivy" % "1.0.0")
- 在
build.sbt中启用Ivy:
ThisBuild / dependencyManager := DependencyManager.Ivy
之后执行sbt update,Ivy会按原有逻辑识别并下载最新SNAPSHOT。
内容的提问来源于stack exchange,提问作者Troy Daniels
相关产品推荐
相关产品推荐

