Sbt中`show externalDependencyClasspath`与`dependencyTree`版本不一致求助
问题描述
我们的软件采用非标准版本号系统,导致sbt出现依赖版本识别错误:
- 在
feature/x-y-z分支中,Jar包以x-y-SNAPSHOT版本发布到Maven仓库(发布工具为mvn或sbt) - 正式发布的Jar包版本格式为
1.2.3-1,表示基于1.2.3版本数据类的首个正式版本
当前sbt配置片段:
val LibVersion = "x-y-SNAPSHOT" lazy val root = project.in(file(".")).settings( libraryDependencies ++= Seq( "com.example" % "some-lib" % LibVersion, "com.example" %% "some-scala-lib" % "4.3.0" ) )
遇到的异常现象:
- 执行
show externalDependencyClasspath时,显示的some-lib-x-y-<datetime info>.jar版本正确 - 执行
dependencyTree时,显示错误的some-lib-1.2.3-6版本 - 通过
sbt stage构建Docker镜像时,也使用了错误的some-lib版本
已尝试添加依赖覆盖但无效:
dependencyOverrides ++= Seq( "com.example" % "some-lib" % LibVersion) // 加不加force()都没用
环境信息:
- sbt版本:1.9.1
- 插件配置(
project/plugins.sbt):
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.16") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.5")
解决方案
1. 强制指定依赖版本(调整解析策略)
在build.sbt中添加版本解析策略,同时给直接依赖追加强制规则:
// 全局强制指定版本 resolutionStrategy := resolutionStrategy.value.withForce( "com.example" % "some-lib" % LibVersion ) // 直接依赖上标记强制 lazy val root = project.in(file(".")).settings( libraryDependencies ++= Seq( "com.example" % "some-lib" % LibVersion force(), "com.example" %% "some-scala-lib" % "4.3.0" ) )
2. 清理sbt缓存
sbt可能缓存了错误的依赖版本,执行以下命令清理后重新拉取:
sbt clean update
如果问题仍存在,手动删除本地Ivy缓存目录:
rm -rf ~/.ivy2/cache/com.example/some-lib
3. 排除传递依赖中的错误版本
先通过可视化依赖树定位引入错误版本的源头:
sbt dependencyBrowseGraph
假设是some-scala-lib传递引入了1.2.3-6版本,在依赖配置中排除该传递依赖:
libraryDependencies ++= Seq( "com.example" % "some-lib" % LibVersion force(), "com.example" %% "some-scala-lib" % "4.3.0" exclude ("com.example", "some-lib") )
4. 修正非标准版本号格式
Ivy(sbt底层依赖解析器)对带连字符的非标准版本号可能存在解析歧义,比如x-y-SNAPSHOT中的连字符可能被误判为版本分隔符。可以尝试修改快照版本格式,比如改为x.y-SNAPSHOT,或者在发布时确保版本号符合Ivy的解析规则。
内容的提问来源于stack exchange,提问作者Troy Daniels
相关产品推荐
相关产品推荐

