SBT 1.1.2离线模式依赖解析失败问题求助
我来帮你分析下这个sbt离线构建的问题——你遇到的情况确实有点奇怪:明明类似问题号称在0.13.2版本就修复了,但在1.1.2里又复现了,而且在线构建完全正常,一切到离线模式就提示org.apache.spark#spark-hive_2.11;2.2.1找不到。结合你的操作记录,我整理了几个可能的排查方向和解决方案:
1. 先确认本地依赖缓存是否真的完整
在线构建成功不代表所有依赖(包括间接依赖)都被正确缓存到本地仓库了。spark-hive很可能是某个核心依赖带出来的间接依赖,在线构建时sbt可能动态拉取了它,但没把它完全存入本地缓存。你可以先在线执行:
sbt clean update
这个命令会强制刷新所有依赖,把直接和间接依赖都下载到本地的~/.ivy2/cache或~/.sbt/1.0/cache目录里,之后再尝试离线构建。
2. 换一种方式开启离线模式
你用的sbt "set offline := true" package是临时设置离线模式,有时候可能会因为配置优先级问题不生效。试试这两种方式:
- 直接用全局参数开启离线:
sbt -offline package - 或者临时在
build.sbt里添加离线配置(测试完记得删掉):offline := true
然后再执行sbt package看看效果。
3. 清理旧缓存,重新下载依赖
sbt 1.x的缓存机制和0.13.x差异很大,可能旧的缓存文件有损坏或者不兼容的情况。你可以先清理spark相关的缓存:
rm -rf ~/.ivy2/cache/org.apache.spark rm -rf ~/.sbt/1.0/cache/org.apache.spark
然后在线执行sbt clean update重新下载所有依赖,再测试离线构建。
4. 显式声明spark-hive依赖
如果spark-hive是间接依赖,可能在线构建时sbt没有把它标记为需要缓存的依赖。你可以在build.sbt里显式添加这个依赖:
libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.2.1" % Provided
(注意根据你的项目实际情况调整Provided这个依赖范围,比如如果是打包到jar里就去掉% Provided)
验证步骤
做完上面的操作后,按这个流程验证:
- 在线模式下跑
sbt clean update package,确保构建成功 - 再跑
sbt -offline clean package,检查离线构建是否正常
内容的提问来源于stack exchange,提问作者Sasgorilla

