我有一个Swagger上的编译依赖项目,它带来了jackson-databind v2.4.5和一个testCompile依赖关系,该库依赖于AWS SDK,它带有jackson-databind v2.6.6 。从Gradle导入项目时IntelliJ错误的依赖关系
运行时的gradle从一个测试,一切工作正常和正确的更新杰克逊依赖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会创建一个“classpath jar”(因为类路径太长)。当检查META-INF/MANIFEST.MF中的类路径时,我可以看到只包含较小版本的jar(2.4.5)。
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.enable([Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/databind/ObjectMapper;
因为老杰克逊API不包含此方法:
当测试使用AWS SDK这将导致异常。
这是不是可以预防?我正在使用一种解决方法,我在testCompile依赖项中添加了jackson-databind依赖项的2.6.6版本。但我想避免这种情况,因为
- 我们不能直接使用杰克逊,它在gradle这个脚本只是因为的IntelliJ的 每次正在使用AWS SDK改变图书馆
- ,我会改变依赖杰克逊以及
注意,我们使用的IntelliJ测试运行,只是因为它比通过在本地工作站上的gradle产出(主要是由于渐进式编译)运行测试速度更快。
我不能这样做,如果我从编译中排除依赖关系,那么应用程序将无法工作。如果我运行生产代码,无论是gradle还是IntelliJ,只有v2.4.5。 – sm4
噢,我的意思是如果它适用于测试,则可以将新版本添加到您的依赖项。或者,如果不会破坏构建,您可以从testCompile依赖关系中排除较新的版本。无论如何,这是不正确的,那么你的测试和生产依赖不同。 – Stanislav
这就是我现在正在做的事(看问题) - 我在gradle脚本中放置了传递依赖的正确版本。我正在寻找一种方法来避免这种情况,因为这是一种黑客行为。 – sm4