我有一个带有Swagger编译依赖项的项目,它带来了jackson-databind v2.4.5和一个testCompile依赖项,该库使用了带有jackson-databind v2.6.6的AWS SDK .
从gradle运行测试时,一切正常,并且正确更新的jackson依赖v2.6.6在类路径上:
+--- io.swagger:swagger-jersey2-jaxrs:1.5.10
| +--- io.swagger:swagger-jaxrs:1.5.10
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.4.5
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6
| | | \--- org.yaml:snakeyaml:1.12 -> 1.13
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.4.5
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.4.5 -> 2.6.6
intellij依赖包含两个版本:
但是,当从IntelliJ运行测试时,IntelliJ会创建一个“类路径jar”(因为类路径太长) . 在检查META-INF / MANIFEST.MF中的类路径时,我可以看到只包含较小版本的jar(2.4.5) .
当测试使用AWS SDK时,这会导致异常:
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.enable([Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/databind/ObjectMapper;
因为较旧的jackson API不包含此方法 .
这有点可预防吗?我目前正在使用一种解决方法,我在testCompile依赖项中添加了jackson-databind依赖项的2.6.6版本 . 但我想避免这种情况,因为
-
我们没有直接使用jackson,因为intellij,它在gradle脚本中
-
每次使用AWS SDK的库发生更改时,我都必须更改jackson依赖项
请注意,我们使用IntelliJ测试运行器只是因为它比通过本地工作站上的gradle运行测试更快(主要是由于增量编译) .
1 回答
不能说,为什么IDE仍然有这个库的2个版本,尽管Gradle解决了依赖关系 . 您可以尝试手动排除对jackson-databind v2.4.5的传递依赖,如下所示:
然后同步Gradle和IDEA项目 .