Java 从Gradle导入项目时IntelliJ中存在错误的依赖项

Java 从Gradle导入项目时IntelliJ中存在错误的依赖项,java,intellij-idea,gradle,dependencies,Java,Intellij Idea,Gradle,Dependencies,我有一个项目,它对Swagger的编译依赖性带来了jackson databind v2.4.5,对一个库的testCompile依赖性带来了jackson databind v2.6.6,它利用了AWS SDK 从gradle运行测试时,一切正常,正确更新的jackson dependency v2.6.6位于类路径上: +--- io.swagger:swagger-jersey2-jaxrs:1.5.10 | +--- io.swagger:swagger-jaxrs:1.5.10

我有一个项目,它对Swagger的编译依赖性带来了jackson databind v2.4.5,对一个库的testCompile依赖性带来了jackson databind v2.6.6,它利用了AWS SDK

从gradle运行测试时,一切正常,正确更新的jackson dependency 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依赖项中添加了2.6.6版的jackson数据绑定依赖项。但我想避免这样,因为

  • 我们并没有直接使用jackson,只是因为intellij,它出现在gradle脚本中
  • 每次使用AWS SDK的库发生更改时,我也必须更改jackson依赖项

  • 请注意,我们使用IntelliJ test runner只是因为它比在本地工作站上通过gradle运行测试要快(主要是由于增量编译)。

    无法解释为什么IDE仍然有两个版本的库,尽管gradle解决了依赖关系。您可以尝试手动排除jackson databind v2.4.5上的可传递依赖项,如下所示:

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

    然后同步Gradle和IDEA项目。

    我不能这样做,如果我从编译中排除依赖项,那么应用程序将无法工作。如果我运行生产代码,不管是gradle还是IntelliJ,只有v2.4.5.Oh,我的意思是,如果可以用于测试,您可以向依赖项添加更新的版本。或者您可以从testCompile依赖项中排除较新版本,如果它不会破坏构建。无论如何,这不好,那么您的测试依赖项和生产依赖项就不同了。这就是我现在正在做的(请参见问题)——我正在将可传递依赖项的正确版本放入gradle脚本中。我正在寻找一种方法来避免这种情况,因为这是一种黑客行为。我刚刚看到,您已经为测试依赖项添加了更新的版本,但是为什么不为编译添加呢?这和GradleI的解决策略一样,我可以做到这一点。但我不想自己重写可传递依赖项。我希望IntelliJ能够正确地解析版本依赖关系(就像Gradle那样)。