【发布时间】:2017-04-16 22:29:40
【问题描述】:
我有一个项目,它在 Swagger 上具有编译依赖项,它带来了 jackson-databind v2.4.5 和一个对使用 AWS SDK 的库的 testCompile 依赖项,它带来了 jackson-databind v2.6.6。
从 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 开发工具包时导致异常:
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,它在gradle脚本中只是因为intellij
- 每次使用 AWS 开发工具包的库发生更改时,我都必须更改 jackson 依赖项
请注意,我们使用 IntelliJ 测试运行程序只是因为它比在本地工作站上通过 gradle 运行测试更快(主要是由于增量编译)。
【问题讨论】:
标签: java intellij-idea gradle dependencies