【发布时间】: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?
我尝试过的:
- 删除项目B目录中的.idea和.gradle
- 删除 gradle 缓存
- 使缓存失效并在 IntelliJ 中重新启动
- 发誓
- 多喝茶
- 询问朋友和同事
- 给奥普拉发邮件
- 在一切正常时恢复到 IntelliJ 15(现在不再是)
- 上厕所(与 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