首页 文章

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

提问于
浏览
1

我在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的nexus上的pom.xml有:

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

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

我尝试过的:

  • 在项目B目录中删除.idea和.gradle

  • 删除gradle缓存

  • 使IntelliJ无效并在IntelliJ中重新启动

  • 咒骂

  • 喝了很多茶

  • 问朋友和同事

  • 通过电子邮件发送奥普拉

  • 当所有这一切都很好时(现在不再是),恢复到IntelliJ 15

  • 上厕所(与5相关)并希望我回来时神奇地修复自己

以上都不是 .

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

任何帮助表示赞赏 .

Update 1
正如LanceJava在评论中所建议的,我跑了 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

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

Update 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文件 .

1 回答

  • 2

    问题中没有明确的是,这个项目使用的是 spring-boot gradle plugin,它强制执行某些版本的库,并强制降级我的elasicsearch版本以使其与我的项目中的spring-data保持一致's spring-data requirements (even though I wasn't ) .

    我通过执行以下方法发现了

    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个插件,是:

    • java

    • maven

    • 想法

    • spring-boot

    而我唯一没有遇到过这个问题的插件是 spring-boot .

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

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

    ext[elasticsearch.version] = '2.3.1'
    

    排序 . 给我更多的茶!

相关问题