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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:37:46