使用 Akka / Akka Streams / Akka HTTP 时 Akka 版本冲突

Posted

技术标签:

【中文标题】使用 Akka / Akka Streams / Akka HTTP 时 Akka 版本冲突【英文标题】:Conflicting Akka versions when using Akka / Akka Streams / Akka HTTP 【发布时间】:2018-02-06 23:45:44 【问题描述】:

我正在尝试使用 Scala 2.12.3、sbt 0.13.6 以及我的 build.sbt 文件中的以下库依赖项构建一个项目:

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.5.4",
  "com.typesafe.akka" %% "akka-stream" % "2.5.4",
  "com.typesafe.akka" %% "akka-stream-testkit" % "2.5.4" % Test,
  "com.typesafe.akka" %% "akka-http" % "10.0.9",
  "com.typesafe.akka" %% "akka-http-core" % "10.0.9",
  "org.scalatest" %% "scalatest" % "3.0.1" % Test)

但是,我不断收到有关版本冲突的以下警告...看来akka-http 对 Akka / Streams 版本 2.4.19 具有传递依赖。我最近发现了一个类似的post,它建议显式添加akka-streams 作为依赖项,并确保它与akka-actor 的版本相同。以下是依赖警告:

[warn] Found version conflict(s) in library dependencies; some are 
suspected to be binary incompatible:
[warn] 
[warn]  * com.typesafe.akka:akka-stream_2.12:2.5.4 is selected over 
2.4.19
[warn]      +- com.typesafe.akka:akka-http-core_2.12:10.0.9       
(depends on 2.4.19)
[warn]      +- com.werner.opttech:dependency-test_2.12:0.0.0      
(depends on 2.4.19)
[warn] 
[warn]  * com.typesafe.akka:akka-actor_2.12:2.5.4 is selected over 
2.4.19
[warn]      +- com.werner.opttech:dependency-test_2.12:0.0.0      
(depends on 2.5.4)
[warn]      +- com.typesafe.akka:akka-stream_2.12:2.5.4           
(depends on 2.5.4)
[warn]      +- com.typesafe.akka:akka-parsing_2.12:10.0.9         
(depends on 2.4.19)

关于如何解决此错误的任何建议,以便我可以使用最新版本的 akka、akka 流和 akka http?谢谢!

【问题讨论】:

如果我删除对akka-actor和akka-streams的依赖,它只会在没有任何警告的情况下解决依赖,但在这种情况下,我会被卡在akka 2.4.19上,对吗? 【参考方案1】:

您的配置是正确的,因为它遵循您提到的compatibility guidelines。我认为您将警告消息误解为错误;您正在使用这些库的 2.5.4 版本。仔细看看这个sn-p:

[warn]  * com.typesafe.akka:akka-actor_2.12:2.5.4 is selected over 2.4.19

sbt 确实选择了 akka-actor 库的 2.5.4 版本而不是 2.4.19 版本。

此外,在 sbt 控制台中运行 show update 会输出以下内容:

[info]  com.typesafe.akka:akka-actor_2.12
[info]          - 2.5.4
[info]                  status: release
[info]                  publicationDate: Thu Aug 10 09:17:00 EDT 2017
....
[info]          - 2.4.19
[info]                  evicted: true
[info]                  evictedData: latest-revision

sbt 移除了 akka-actor 的 2.4.19 版本,转而使用 2.5.4 版本。

警告消息实际上确认您正在使用当前版本的 Akka 工具。

【讨论】:

是的,我可以看到它正在为 2.5.4 驱逐 2.4.19,但由于这些警告,我不确定是否会导致任何新问题。感谢您的回复!【参考方案2】:

chunjef 的回答是正确的。如果您确实想清除警告,请将以下代码添加到您的 build.sbt。

conflictManager := ConflictManager.strict

dependencyOverrides += "com.typesafe.akka" %% "akka-actor" % "2.5.4"

dependencyOverrides += "com.typesafe.akka" %% "akka-stream" % "2.5.4"

dependencyOverrides += "org.scala-lang" % "scala-library" % "2.12.3"

【讨论】:

【参考方案3】:

相关的种类: akka-http 10.1.0-RC1 removes the transient dependency:

我们将策略更改为不再显式依赖akka-stream,而是在我们的构建中将其标记为provided 依赖。这意味着您必须始终向akka-stream 添加手动依赖项。

【讨论】:

以上是关于使用 Akka / Akka Streams / Akka HTTP 时 Akka 版本冲突的主要内容,如果未能解决你的问题,请参考以下文章

在“Akka-Streams”中使用`extrapolate`的用例是什么?

如何将 Akka Streams SourceQueue 与 PlayFramework 一起使用

Akka Streams:流中的状态

由于 Kafka Streams 现在可用,SMACK 堆栈中是不是需要 Spark 和 Akka? [关闭]

在Redis pub / sub和Akka Streams中使用SSE的最简单方法是什么?

如何改善响应式 kafka(Scala 加 Akka Streams)的缓慢性能?