我在我的 Play Framework 应用程序项目中突然遇到了一个奇怪的错误。直到昨天,我的 sbt 测试运行良好,但现在因运行中止而失败。唯一的区别是我添加了一个新的依赖项:
"io.fabric8" % "kubernetes-client" % "6.9.0",
当我跑步时
sbt 清洁测试
我收到以下错误消息:
An exception or error caused a run to abort: Scala module 2.11.4 requires Jackson Databind version >= 2.11.0 and < 2.12.0
com.fasterxml.jackson.databind.JsonMappingException: Scala module 2.11.4 requires Jackson Databind version >= 2.11.0 and < 2.12.0
at com.fasterxml.jackson.module.scala.JacksonModule.setupModule(JacksonModule.scala:61)
at com.fasterxml.jackson.module.scala.JacksonModule.setupModule$(JacksonModule.scala:46)
at com.fasterxml.jackson.module.scala.DefaultScalaModule.setupModule(DefaultScalaModule.scala:17)
at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:879)
at akka.serialization.jackson.JacksonObjectMapperProvider$.$anonfun$configureObjectMapperModules$4(JacksonObjectMapperProvider.scala:242)
at akka.serialization.jackson.JacksonObjectMapperProvider$.$anonfun$configureObjectMapperModules$4$adapted(JacksonObjectMapperProvider.scala:241)
at scala.collection.immutable.List.foreach(List.scala:333)
at akka.serialization.jackson.JacksonObjectMapperProvider$.configureObjectMapperModules(JacksonObjectMapperProvider.scala:241)
at akka.serialization.jackson.JacksonObjectMapperProvider$.createObjectMapper(JacksonObjectMapperProvider.scala:265)
at akka.serialization.jackson.JacksonObjectMapperProvider.create(JacksonObjectMapperProvider.scala:359)
at akka.serialization.jackson.JacksonObjectMapperProvider.$anonfun$getOrCreate$1(JacksonObjectMapperProvider.scala:317)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at akka.serialization.jackson.JacksonObjectMapperProvider.getOrCreate(JacksonObjectMapperProvider.scala:317)
at akka.serialization.jackson.JacksonJsonSerializer.<init>(JacksonSerializer.scala:141)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at akka.actor.ReflectiveDynamicAccess.$anonfun$createInstanceFor$1(ReflectiveDynamicAccess.scala:40)
at scala.util.Try$.apply(Try.scala:210)
我真的不知道它从哪里拉出 scala 模块 2.11,因为我的项目依赖于 scala 2.13。我运行了 sbt dependencyTree,在这里我可以看到 jackson databind 版本总是像这样被逐出:
+-com.fasterxml.jackson.core:jackson-databind:2.11.4 (evicted by: 2.15.2)
我还有一个像这样的测试依赖项:
"io.fabric8" % "kubernetes-server-mock" % "6.9.0" % Test
我意识到删除这个后,问题就消失了。所以我相信这个测试依赖实际上导致了这个错误,但我需要这个库用于测试目的。我该如何修复这个错误?
您的项目传递(或直接)拉取的所有 Jackson 库必须具有相同的次要版本 2.x。
这里您正在拉取 Jackson Scala 模块 2.11.x,但显然也拉取了 Jackson Databind 2.15.x。
这是因为您至少有两个依赖项,它们本身将 Jackson 拉入不同的版本。
要解决这种情况,您应该在
dependencyOverrides
中定义 build.sbt
来修复所有 Jackson 库的通用次要版本。