You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT从0.13.9升级至1.1.2后依赖无法下载到Ivy缓存的问题

解决SBT 1.1.2无法解析公司仓库依赖的问题

我之前也碰到过类似的SBT版本升级后依赖解析异常的情况,结合你的配置和问题描述,大概率是SBT 1.x系列对仓库解析逻辑的调整导致的,下面分几个方向排查和解决:

1. 修正仓库配置的布局类型

SBT 0.13.x对仓库布局的兼容性比较宽松,但1.x版本开始对Resolver.url的默认行为做了变更——它默认使用Ivy风格的仓库布局,而你公司的Artifactory仓库是标准的Maven布局(libs-release/libs-snapshot-local都是Maven结构),这就导致解析路径不匹配,只能找到部分符合Ivy布局的工件。

你可以把仓库配置改成更明确的Maven风格声明:

resolvers += Resolver.mavenLocal
// 用at关键字直接声明Maven仓库,更简洁且明确
resolvers += "my-release" at "https://myrepo.net/artifactory/libs-release"
resolvers += "my-snapshot" at "https://myrepo.net/artifactory/libs-snapshot-local"

如果必须保留Resolver.url的写法,需要手动指定Maven风格的路径匹配规则:

resolvers += Resolver.url("my-release", url("https://myrepo.net/artifactory/libs-release"))(Resolver.mavenStylePatterns)
resolvers += Resolver.url("my-snapshot", url("https://myrepo.net/artifactory/libs-snapshot-local"))(Resolver.mavenStylePatterns)

2. 清理本地缓存并强制更新

SBT升级后,旧版本的缓存(Ivy和SBT自身的缓存)可能存在兼容性问题,导致依赖无法正常写入或读取。执行以下命令清理缓存:

# 清理Ivy缓存
rm -rf ~/.ivy2/cache
# 清理SBT自身的缓存
rm -rf ~/.sbt/cache

然后在项目根目录执行sbt clean update,强制重新拉取所有依赖。

3. 检查快照仓库的更新策略

SBT 1.x对快照依赖的默认更新策略更保守,默认不会频繁检查快照版本的更新,可能导致新的快照依赖无法被识别。可以在build.sbt中添加快照更新策略:

updateOptions := updateOptions.value.withSnapshotResolvePolicy(SnapshotResolvePolicy.AlwaysUpdate)

这样每次执行update时都会强制检查快照仓库的最新版本。

4. 验证仓库认证配置

如果你的公司仓库需要身份认证,确认SBT 1.x能读取到正确的认证信息:

  • 检查~/.sbt/1.0/credentials文件是否存在(SBT 1.x默认读取这个路径,而0.13.x是~/.sbt/0.13/credentials),如果没有就把旧的认证文件复制过来。
  • 也可以在项目的build.sbt中显式指定认证文件路径:
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

5. 检查依赖声明的正确性

最后确认项目中的依赖声明没有问题:

  • 确保使用%%(自动匹配Scala版本)或%(手动指定版本)的方式正确。
  • 检查依赖的范围(比如compile/test/provided)是否合理,避免因为范围限制导致传递依赖被排除。

先从修改仓库布局配置开始尝试,这是最常见的原因,应该能解决大部分问题。

内容的提问来源于stack exchange,提问作者Lev Sivashov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:03:37