阅读sbt依赖树

时间:2018-02-15 01:53:21

标签: scala playframework sbt dependency-management

我正在Play中升级一些库!项目。在此过程中,我正在尝试解决这样的错误: java.lang.ClassNotFoundException: akka.event.slf4j.Slf4jLoggingFilter

我假设它来自不兼容的传递依赖?

但我正努力有效地使用sbt-dependency-graph来帮助我追查问题。

[info]   +-ch.qos.logback:logback-classic:1.1.3
[info]   | +-ch.qos.logback:logback-core:1.1.3
[info]   | +-org.slf4j:slf4j-api:1.7.21
[info]   | +-org.slf4j:slf4j-api:1.7.7 (evicted by: 1.7.21)

为什么列出了slf4j-api的2个版本

我假设,较新的版本(1.7.21)优先于1.7.7但是,为什么在某些情况下,我会看到同一个依赖项的多达5个不同版本(所有但是1被驱逐了):

  | | | | +-org.slf4j:slf4j-ext:1.7.12
  | | | |   +-ch.qos.cal10n:cal10n-api:0.8.1
  | | | |   +-org.slf4j:slf4j-api:1.6.2 (evicted by: 1.7.21)
  | | | |   +-org.slf4j:slf4j-api:1.6.4 (evicted by: 1.7.21)
  | | | |   +-org.slf4j:slf4j-api:1.7.12 (evicted by: 1.7.21)
  | | | |   +-org.slf4j:slf4j-api:1.7.2 (evicted by: 1.7.21)
  | | | |   +-org.slf4j:slf4j-api:1.7.21

一旦发现冲突 - 我是否需要将所有依赖项升级为使用相同版本?

我应该采取另一种方法吗?

1 个答案:

答案 0 :(得分:0)

发现"the SLF4J API is backward compatible for all versions"。尽管从java.lang.ClassNotFoundException调用slf4j。所以深入挖掘一下:

Akka Kindly提供binary compatibility rules,表明主要版本之间违反了向后兼容性。

查看依赖关系树,我们看到了akka依赖关系的不同主要版本(2.3.x和2.4.x):com.typesafe.akka:akka-actor_2.11:2.3.13 (evicted by: 2.4.11)com.typesafe.akka:akka-slf4j_2.11:2.3.13

标准化主要版本的所有akka依赖关系修复它:

我们的原始依赖项仅提供"com.typesafe.akka" %% "akka-actor" % "2.4.11",并且play正在提供"akka-slf4j" % "2.3.13"传递,这打破了二进制兼容性。

+-com.typesafe.akka:akka-slf4j_2.11:2.3.13 [S]
| +-com.typesafe.akka:akka-actor_2.11:2.3.13 (evicted by: 2.4.11)

同时为akka-slf4jakka-actor提供相同的主要版本解决了这个问题。