2016-12-02 193 views
1

我有一个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包含两个版本:

Both dependencies displayed

但是,从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版本。但我想避免这种情况,因为

  1. 我们不能直接使用杰克逊,它在gradle这个脚本只是因为的IntelliJ的
  2. 每次正在使用AWS SDK改变图书馆
  3. ,我会改变依赖杰克逊以及

注意,我们使用的IntelliJ测试运行,只是因为它比通过在本地工作站上的gradle产出(主要是由于渐进式编译)运行测试速度更快。

回答

0

不能说,为什么IDE仍然有2个版本的这个库,尽管Gradle解决了依赖关系。您可以尝试手动排除这样的杰克逊 - 数据绑定v2.4.5传递依赖的东西:

compile('io.swagger:swagger-jersey2-jaxrs:1.5.10') { 
    exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' 
} 

,然后同步摇篮和IDEA项目。

+0

我不能这样做,如果我从编译中排除依赖关系,那么应用程序将无法工作。如果我运行生产代码,无论是gradle还是IntelliJ,只有v2.4.5。 – sm4

+0

噢,我的意思是如果它适用于测试,则可以将新版本添加到您的依赖项。或者,如果不会破坏构建,您可以从testCompile依赖关系中排除较新的版本。无论如何,这是不正确的,那么你的测试和生产依赖不同。 – Stanislav

+0

这就是我现在正在做的事(看问题) - 我在gradle脚本中放置了传递依赖的正确版本。我正在寻找一种方法来避免这种情况,因为这是一种黑客行为。 – sm4