我正在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
一旦发现冲突 - 我是否需要将所有依赖项升级为使用相同版本?
我应该采取另一种方法吗?
答案 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-slf4j
和akka-actor
提供相同的主要版本解决了这个问题。