如何清理sbt缓存?解决sbt 1.3.9同版本依赖更新失效问题
如何清理sbt缓存以重新下载同版本变更的依赖?
针对你遇到的问题——依赖内容更新但版本号未变,执行sbt update却无法触发重新下载,核心原因是sbt 1.3+默认使用Coursier做依赖管理,会对同版本的依赖进行本地缓存,即使远程仓库的包已经更新,sbt也会优先使用本地缓存的内容。下面是几种可行的解决方法:
方法1:手动清理本地Coursier缓存
sbt 1.3+的依赖缓存由Coursier管理,不同系统的缓存路径如下:
- Linux/macOS:
~/.cache/coursier/v1 - Windows:
C:\Users\<你的用户名>\AppData\Local\Coursier\Cache\v1
你可以选择:
- 删除整个缓存目录:适合需要彻底重置所有依赖缓存的场景,但第一次重新下载会耗时较久。
- 精准删除特定依赖的缓存:比如找到
com.google.api-client/google-api-client/1.30.7这类对应依赖的子目录删除,这样不会影响其他项目的缓存。
方法2:使用sbt强制更新命令(无需手动删缓存)
如果不想手动操作缓存目录,可以直接用sbt自带的强制刷新参数:
- 在终端执行:
sbt clean update --refresh - 或者进入sbt交互模式后运行:
updateRefresh
这个命令会让sbt忽略本地缓存,重新检查远程仓库的依赖状态,下载最新的同版本包。
方法3:调整sbt配置(适合长期需求)
看你的sbt.build里已经关闭了缓存解析(withCachedResolution(false)),如果需要长期针对同版本依赖触发更新,可以补充配置:
updateOptions := updateOptions.value .withCachedResolution(false) // 如果你的依赖是SNAPSHOT版本,开启下面这条;如果是Release版本,这条可忽略 .withLatestSnapshots(true)
不过对于Release版本的依赖(比如你用的1.30.7、3.9这类固定版本号),sbt默认不会主动检查更新,所以最直接的方式还是用方法2的--refresh参数。
额外注意事项
- 确认私有仓库(比如你的Jfrog Artifactory)允许覆盖同版本的Release包:有些仓库会将Release版本设置为不可修改,如果远程包本身没有更新,清理本地缓存也没用。
- 清理缓存后第一次执行
update会比平时慢,因为需要重新下载所有依赖。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

