Gradle依赖关系管理 - 传递依赖关系版本不正确

时间:2016-07-26 11:10:29

标签: intellij-idea gradle dependency-management

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

项目A将elasticsearch的编译范围依赖项定义为:

ng-cloak

项目B声明项目A的编译范围依赖关系,如下所示:

    compile 'org.elasticsearch:elasticsearch:2.3.1'

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

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

相反,我看到了:

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

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

事实上,项目A的nexus上的pom.xml有:

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

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

我尝试了什么:

  1. 删除项目B目录中的.idea和.gradle
  2. 删除gradle缓存
  3. 使高速缓存无效并在IntelliJ中重新启动
  4. 宣誓
  5. 喝大量的茶
  6. 问朋友和同事
  7. 通过电子邮件发送奥普拉
  8. 当所有这一切都很好(现在不再是)时,恢复到IntelliJ 15
  9. 上厕所(与5相关)并希望我回来时神奇地修复自己
  10. 以上工作都没有。

    在项目B中具体指定<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.3.1</version> <scope>compile</scope> </dependency> 依赖项的工作是什么,但这不能否定传递依赖项的全部原因吗?

    感谢任何帮助。

    更新1
    正如LanceJava在评论中所建议的,我跑elasticsearch:2.3.1看看发生了什么。

    这表明它特别降级了它:

    gradle dependencies

    当我在该依赖项上运行gradle dependencyInsight时,它出现了:

    org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2
    

    任何人都有任何想法为什么会这样?

    更新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)。

    我通过添加:

    来修复此问题
    :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
    

    到我的build.gradle文件。

1 个答案:

答案 0 :(得分:2)

问题中没有明确表示该项目使用spring-boot gradle plugin,它强制执行某些版本的库,并强制降级我的elasicsearch版本以保留它符合它的弹簧数据要求(即使我在项目中没有使用弹簧数据)。

我通过执行:

发现了这一点
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. 弹簧引导
  5. 并且我没有在其他地方使用的唯一插件(因此在其他地方没有遇到此问题)是spring-boot

    一旦我对这个插件进行了评论,我就会发现依赖是正确的。

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

    ext[elasticsearch.version] = '2.3.1'
    

    排序。给我更多的茶!