我在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?
我尝试了什么:
以上工作都没有。
在项目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
任何人都有任何想法为什么会这样?
似乎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文件。
答案 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个插件,是:
并且我没有在其他地方使用的唯一插件(因此在其他地方没有遇到此问题)是spring-boot
。
一旦我对这个插件进行了评论,我就会发现依赖是正确的。
此时我了解到我需要明确指定我想要使用的版本:
ext[elasticsearch.version] = '2.3.1'
排序。给我更多的茶!