我该如何解决这些依赖性警告

时间:2019-10-09 18:23:21

标签: scala playframework sbt

为播放应用程序启动sbt shell时,我仍然看到这些消息:

[warn]  * com.typesafe.akka:akka-actor_2.11:2.5.21 is selected over {2.3.13, 2.4.20}
[warn]      +- com.typesafe.akka:akka-slf4j_2.11:2.5.21 ()        (depends on 2.5.21)
[warn]      +- com.typesafe.play:play_2.11:2.6.23 ()              (depends on 2.5.21)
[warn]      +- com.typesafe.akka:akka-stream_2.11:2.5.21 ()       (depends on 2.5.21)
[warn]      +- com.typesafe.akka:akka-parsing_2.11:10.0.15 ()     (depends on 2.4.20)

我该如何解决?我是否需要显式设置akka版本,使其不选择2.5.21?

2 个答案:

答案 0 :(得分:2)

我建议挂接sbt-dependency-graph sbt插件,并使用以下命令找出哪些组件取决于哪个版本的akka​​-actor

sbt <project>/dependencyTree
sbt "<project>/whatDependsOn <organization> <module> <revision>"
sbt <project>/evicted

列出了组件依赖项列表之后,您有几种选择:

  • 确保您使用的组件版本(例如播放) 通常需要相同版本的akka​​-actor和akka。我通常通过在https://mvnrepository.com/
  • 上检查相关库的POM文件来做到这一点
  • 强制sbt使用特定版本的akka​​(通过dependencyOverrides)。它 通常可以安全地对不同的补丁版本进行操作(如 major.minor.patch),用于使用语义版本控制的库 (https://semver.org/)。但这可能会给不同的未成年人造成问题。 如果主要版本不向后兼容,则尤其如此。
  • 如果冲突和警告没有引起问题,请忽略它们。
  • 如果您使用sbt-assembly创建胖子罐,则可以使用shading来进行 允许多个版本的akka​​通过以下方式驻留在同一应用程序中 将其中一个移至其他包装。但这并非总是可能的(例如,当库通过名称动态加载类时)
  • 编写自定义类加载器,以将库的不同版本动态加载到单独的保护域中。它并不简单,需要大量代码。我不建议在Akka上使用它。

答案 1 :(得分:1)

您得到的是sbt的驱逐警告,您可以在此link上查看文档。

您可以做的是重写sbt文件上使用的依赖项,以避免运行时错误。

例如:

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

通过这种方式,您可以指定要使用哪个版本的库。 您还可以检查sbt的插件dependency-graph,以了解项目中的所有依赖项。