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
相关产品推荐
相关产品推荐

