Scala3+SBT构建Akka HTTP应用时依赖交叉版本冲突问题排查
解决Scala 3 + SBT中依赖交叉版本冲突问题
你遇到的modules were resolved with conflicting cross-version suffixes错误,核心原因是依赖树中同时存在针对Scala 2.13(后缀_2.13)和Scala 3(后缀_3)的同一类库模块,导致SBT无法确定使用哪个版本。具体诱因可以从以下几点排查:
可能的错误原因
- 不必要的强制2.13版本依赖:你添加的部分依赖本身已经官方支持Scala 3,却被强制指定使用2.13版本。比如:
scala-logging 3.9.3:从3.9.0版本开始就原生支持Scala 3,无需用CrossVersion.for3Use2_13json4s-native 4.1.0-M4:该版本已适配Scala 3,强制拉取2.13版本会和其他依赖中的Scala 3版本冲突circe-generic 0.15.0-M1:Circe从0.14.x版本开始支持Scala 3,强制2.13版本会引发版本后缀冲突
- 传递依赖引入冲突:即使你给主依赖加了2.13版本指定,它的传递依赖可能会拉取同一库的Scala 3版本(比如Akka HTTP相关依赖都是Scala 3版本,可能和你强制的2.13依赖产生传递依赖冲突)
- 版本不匹配的适配库:
akka-http-circe和akka-http-json4s的1.39.2版本可能未原生支持Scala 3,强制使用2.13版本后,其依赖的Circe/Json4s模块和你直接引入的Scala 3版本模块冲突
解决步骤
1. 移除不必要的CrossVersion.for3Use2_13
对已经支持Scala 3的依赖,去掉强制2.13版本的配置,修改后的依赖片段如下:
libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-http" % akkaHttpVersion, "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion, "com.typesafe.akka" %% "akka-actor-typed" % akkaVersion, "com.typesafe.akka" %% "akka-stream" % akkaVersion, "com.typesafe.akka" %% "akka-pki" % akkaVersion, // 去掉不必要的cross配置 "com.typesafe.scala-logging" %% "scala-logging" % "3.9.3", // 若akka-http-circe/json4s 1.39.2不支持Scala3,暂时保留cross ("de.heikoseeberger" %% "akka-http-circe" % "1.39.2").cross(CrossVersion.for3Use2_13), ("de.heikoseeberger" %% "akka-http-json4s" % "1.39.2").cross(CrossVersion.for3Use2_13), "org.json4s" %% "json4s-native" % "4.1.0-M4", "io.circe" %% "circe-generic" % "0.15.0-M1", "ch.qos.logback" % "logback-classic" % "1.2.11", "com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion % Test, "com.typesafe.akka" %% "akka-actor-testkit-typed" % akkaVersion % Test, "org.scalatest" %% "scalatest" % "3.2.12" % Test )
2. 排查具体冲突模块
运行SBT命令查看完整依赖树,定位冲突的具体模块:
sbt dependencyTree
在输出中查找带有_2.13和_3后缀的同一库,比如如果看到circe-core_2.13和circe-core_3同时出现,就是冲突点。
3. 升级适配Scala3的依赖版本(可选但推荐)
如果akka-http-circe和akka-http-json4s的1.39.2版本确实不支持Scala3,建议升级到支持Scala3的版本(比如1.40.0及以上),这样可以完全移除CrossVersion.for3Use2_13配置,从根源避免冲突:
// 升级到支持Scala3的版本 "de.heikoseeberger" %% "akka-http-circe" % "1.40.0", "de.heikoseeberger" %% "akka-http-json4s" % "1.40.0",
4. 强制统一依赖版本(兜底方案)
如果仍有冲突,使用dependencyOverrides强制指定同一版本的Scala3兼容模块:
dependencyOverrides ++= Seq( "io.circe" %% "circe-core" % "0.15.0-M1", "org.json4s" %% "json4s-core" % "4.1.0-M4" )
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

