Java 从Gradle导入项目时IntelliJ中存在错误的依赖项
我有一个项目,它对Swagger的编译依赖性带来了jackson databind v2.4.5,对一个库的testCompile依赖性带来了jackson databind v2.6.6,它利用了AWS SDK 从gradle运行测试时,一切正常,正确更新的jackson dependency v2.6.6位于类路径上: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
+--- 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数据绑定依赖项。但我想避免这样,因为
请注意,我们使用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那样)。