【问题标题】:Wrong dependencies in IntelliJ when importing project from Gradle从 Gradle 导入项目时 IntelliJ 中的错误依赖项
【发布时间】: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 版本。但我想避免这种情况,因为

  1. 我们没有直接使用jackson,它在gradle脚本中只是因为intellij
  2. 每次使用 AWS 开发工具包的库发生更改时,我都必须更改 jackson 依赖项

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

【问题讨论】:

    标签: java intellij-idea gradle dependencies


    【解决方案1】:

    不能说,为什么 IDE 仍然有这个库的 2 个版本,尽管 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。
    • 哦,我的意思是你可以在你的依赖项中添加一个更新的版本,如果它适用于测试的话。或者,如果它不会破坏构建,您可以从 testCompile 依赖项中排除较新版本。反正不行,那你的测试和生产依赖不一样。
    • 这就是我现在正在做的事情(见问题) - 我将传递依赖的正确版本放在 gradle 脚本中。我正在寻找一种方法来避免这种情况,因为它是一种 hack。
    • 我刚刚看到,您已经添加了更新版本来测试依赖项,但是为什么不进行编译呢?这与 Gradle 中的解析策略相同
    • 我能做到。但我不想自己覆盖传递依赖。我希望 IntelliJ 能够正确解析依赖版本(与 Gradle 相同)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2016-01-27
    • 2014-08-23
    • 2020-06-17
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多