【问题标题】:Gradle Dependency Management - Transitive Dependency Version IncorrectGradle 依赖管理 - 传递依赖版本不正确
【发布时间】:2016-11-30 00:09:50
【问题描述】:

我在 IntelliJ IDEA 2016 中编辑了两个使用 Gradle 依赖管理的项目:项目 A 和项目 B。

项目A为elasticsearch定义了一个编译范围依赖:

    compile 'org.elasticsearch:elasticsearch:2.3.1'

项目 B 为项目 A 声明了一个编译范围依赖项,如下所示:

    compile 'com.mycompany:elasticsearch-common:2.3.1'

我希望,在 IntelliJ IDEA 2016 的 Gradle 工具窗口中,项目 B 可以看到:

...
com.mycompany:elasticsearch-common:2.3.1 (Compile)
    org.elasticsearch:elasticsearch:2.3.1 (Compile)
...

相反,我看到了:

...
com.mycompany:elasticsearch-common:2.3.1 (Compile)
    org.elasticsearch:elasticsearch:1.5.2 (Compile)
...

项目 B 中没有其他依赖项依赖于 elasticsearch,因此它不会被另一个依赖项声明覆盖。

确实,我们项目 A 的关系上的 pom.xml 有这个:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.3.1</version>
    <scope>compile</scope>
</dependency>

那么,为什么 IntelliJ 将 elasticsearch 的传递版本报告为 1.5.2?

我尝试过的:

  1. 删除项目B目录中的.idea和.gradle
  2. 删除 gradle 缓存
  3. 使缓存失效并在 IntelliJ 中重新启动
  4. 发誓
  5. 多喝茶
  6. 询问朋友和同事
  7. 给奥普拉发邮件
  8. 在一切正常时恢复到 IntelliJ 15(现在不再是)
  9. 上厕所(与 5 有关),希望我回来后它会神奇地自行修复

以上都不起作用。

在项目 B 中专门指定 elasticsearch:2.3.1 依赖项的作用是什么,但这不是否定传递依赖项的全部原因吗?

感谢任何帮助。

更新 1
正如 LanceJava 在 cmets 中所建议的那样,我运行 gradle dependencies 以查看发生了什么。

这表明它正在专门降级它:

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2

当我对该依赖项运行 gradle dependencyInsight 时,它提出了:

:dependencyInsight
com.mycompany:elasticsearch-common:2.3.1 (selected by rule)
\--- compile

org.elasticsearch:elasticsearch:1.5.2 (selected by rule)

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2
\--- com.mycompany:elasticsearch-common:2.3.1
     \--- compile

有人知道为什么会这样吗?

更新 2
这似乎有答案:https://discuss.gradle.org/t/excluded-dependence-comes-back-when-spring-boot-plugin-is-applied/17945/2

似乎 gradle spring-boot 插件喜欢接管一点并强制执行它自己的依赖版本(即使我没有使用正在使用 spring-data 的 spring-boot-starter)。

我通过添加解决了这个问题:

ext[elasticsearch.version] = '2.3.1'

到我的 build.gradle 文件。

【问题讨论】:

  • 试试gradle dependencies 命令行。它应该告诉你发生了什么。也许有一个自定义的ResolutionStrategy
  • @LanceJava 谢谢!我这样做了,它看起来像是专门降级它:org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2 当我做dependencyInsight它想出了:org.elasticsearch:elasticsearch:1.5.2(按规则选择)org .elasticsearch:elasticsearch:2.3.1 -> 1.5.2 \--- com.mycompany:elasticsearch-common:2.3.1 \--- 运行时
  • @LanceJava 查看更新。

标签: intellij-idea gradle dependency-management


【解决方案1】:

问题中没有明确说明的是,该项目正在使用 spring-boot gradle plugin,它强制执行某些版本的库,并强制降级我的 elasicsearch 版本以使其与弹簧保持一致-数据要求(即使我没有在我的项目中使用 spring-data)。

我通过执行发现了这一点:

gradle dependencyInsight --dependency elasticsearch --configuration compile

当时的结果是:

org.elasticsearch:elasticsearch:1.5.2 (selected by rule) 

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2 
   \--- com.mycompany:elasticsearch-common:2.3.1 
       \--- runtime

我了解到(selected by rule) 部分意味着某些东西正在以编程方式选择该特定版本。这将其缩小为一个插件。

我只使用了 4 个插件,分别是:

  1. java
  2. 行家
  3. 想法
  4. 弹簧启动

我没有在其他地方使用过的唯一插件(因此在其他地方没有遇到这个问题)是spring-boot

一旦我注释掉这个插件,我可以看到依赖是正确的。

此时我了解到我需要明确指定我想要使用的版本:

ext[elasticsearch.version] = '2.3.1'

已排序。给我更多的茶!

【讨论】:

  • 哥们,谢谢你花时间把这个问答写下来,我被同样的折磨,终于在这里找到了救赎!
猜你喜欢
  • 2019-04-07
  • 2021-01-04
  • 1970-01-01
  • 2019-12-29
  • 2015-04-03
  • 2013-06-15
  • 2017-08-21
相关资源
最近更新 更多