热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Gradle&Springboot引入ES低版本的问题

之前在做项目的时候需要在SpringBoot中引入ElasticSearch,但是由于服务器版本较低,最新版ES是6.x.x,而我需要的是5.1.1(org.elasticsear

之前在做项目的时候需要在 SpringBoot中引入 ElasticSearch,但是由于服务器版本较低,最新版 ES 是6.x.x,而我需要的是5.1.1(org.elasticsearch.client:transport:5.1.1)。当我引入5.1.1的版本包的时候,org.elasticsearch.client:transport:5.1.1中依赖的org.elasticsearch:elasticsearch自动升级成了6.x.x。 折腾搜索了一天,终于找到了原因。在这里记录一下整个排查流程。

一开始在启动SpringBoot时,会抛出 ElasticSearch 有某个类/某个方法未找到的异常,因此怀疑是引入的包版本不正确。

使用 gradle -q dependencies指令,输出如下

+--- org.elasticsearch.client:transport:5.1.1
| +--- org.elasticsearch:elasticsearch:5.1.1 -> 6.4.3
| | +--- org.elasticsearch:elasticsearch-core:6.4.3
| | +--- org.elasticsearch:elasticsearch-secure-sm:6.4.3
| | +--- org.elasticsearch:elasticsearch-x-content:6.4.3
| | | +--- org.elasticsearch:elasticsearch-core:6.4.3
| | | +--- org.yaml:snakeyaml:1.17 -> 1.23
| | | +--- com.fasterxml.jackson.core:jackson-core:2.8.10 -> 2.9.8
| | | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.8.10 -> 2.9.8
| | | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.10 -> 2.9.8 (*)
| | | \--- com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.8.10 -> 2.9.8
| | +--- org.apache.lucene:lucene-core:7.4.0
| | +--- org.apache.lucene:lucene-analyzers-common:7.4.0
| | +--- org.apache.lucene:lucene-backward-codecs:7.4.0
| | +--- org.apache.lucene:lucene-grouping:7.4.0
| | +--- org.apache.lucene:lucene-highlighter:7.4.0
| | +--- org.apache.lucene:lucene-join:7.4.0
| | +--- org.apache.lucene:lucene-memory:7.4.0
| | +--- org.apache.lucene:lucene-misc:7.4.0
| | +--- org.apache.lucene:lucene-queries:7.4.0
| | +--- org.apache.lucene:lucene-queryparser:7.4.0
| | +--- org.apache.lucene:lucene-sandbox:7.4.0
| | +--- org.apache.lucene:lucene-spatial:7.4.0
| | +--- org.apache.lucene:lucene-spatial-extras:7.4.0
| | +--- org.apache.lucene:lucene-spatial3d:7.4.0
| | +--- org.apache.lucene:lucene-suggest:7.4.0
| +--- org.elasticsearch.plugin:transport-netty4-client:5.1.1 -> 6.4.3
| | +--- io.netty:netty-buffer:4.1.16.Final -> 4.1.33.Final (*)
| | +--- io.netty:netty-codec:4.1.16.Final -> 4.1.33.Final (*)
| | +--- io.netty:netty-codec-http:4.1.16.Final -> 4.1.33.Final
| | +--- io.netty:netty-common:4.1.16.Final -> 4.1.33.Final
| | +--- io.netty:netty-handler:4.1.16.Final -> 4.1.33.Final (*)
| | +--- io.netty:netty-resolver:4.1.16.Final -> 4.1.33.Final (*)
| | \--- io.netty:netty-transport:4.1.16.Final -> 4.1.33.Final (*)

可以看到transport下所依赖的部分包自动升级成了6.4.3。但是在gradle中并没有设置什么。 因此继续使用gradlew -q dependencyInsight --dependency elasticsearch --info查看 elasticsearch的具体依赖:

org.elasticsearch:elasticsearch:6.4.3 (selected by rule)
variant "runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
org.elasticsearch:elasticsearch:5.1.1 -> 6.4.3
\--- org.elasticsearch.client:transport:5.1.1
\--- compileClasspath
org.elasticsearch:elasticsearch-cli:6.4.3
variant "runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
org.elasticsearch:elasticsearch-cli:6.4.3
\--- org.elasticsearch:elasticsearch:6.4.3
\--- org.elasticsearch.client:transport:5.1.1
\--- compileClasspath
org.elasticsearch:elasticsearch-core:6.4.3
variant "runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
org.elasticsearch:elasticsearch-core:6.4.3
+--- org.elasticsearch:elasticsearch:6.4.3
| \--- org.elasticsearch.client:transport:5.1.1
| \--- compileClasspath
+--- org.elasticsearch:elasticsearch-cli:6.4.3
| \--- org.elasticsearch:elasticsearch:6.4.3 (*)
\--- org.elasticsearch:elasticsearch-x-content:6.4.3
\--- org.elasticsearch:elasticsearch:6.4.3 (*)

发现了前两项直接使用了6.4.3的版本,给出的理由是 **selected by rule**,我就想说gradle这是啥奇奇怪怪的规则。。。经过一番搜索,终于发现这一篇帖子

大体是说SpringBoot的插件,会通过Spring dependency-management-plugin增加自己的依赖规则,其中包括会强制引入特定的版本,并忽视掉自己在gradle配置的版本(这也太坑了吧)。

//就是这个插件
apply plugin: 'io.spring.dependency-management'

所以最后的解决方法是自定义全局的版本控制,如下

allprojects {
configurations.all {
resolutionStrategy {
dependencySubstitution {
substitute module('org.elasticsearch:elasticsearch') with module('org.elasticsearch:elasticsearch:5.1.1')
substitute module('org.elasticsearch.plugin:transport-netty4-client') with module('org.elasticsearch.plugin:transport-netty4-client:5.1.1')
substitute module('org.elasticsearch.client:elasticsearch-rest-client') with module('org.elasticsearch.client:elasticsearch-rest-client:5.1.1')
}
}
}
}

这可以告诉gradle强制使用5.1.1版本去替换依赖的elasticsearch的版本。当然这里我引入的transport所依赖的transport-netty4-clientelasticsearch-rest-client都被强制升级了,所以这里也进行配置一下。

最后,也许可以通过配置spring的插件解决,附上插件的github地址,有空研究一下


推荐阅读
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
  • 微信小程序支付官方参数小程序中代码后端发起支付代码支付回调官方参数文档地址:https:developers.weixin.qq.comminiprogramdeva ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 探讨了生成时间敏感的一次性伪随机密码的方法,旨在通过加入时间因素防止重放攻击。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • Cadence SPB 16.5 安装指南与注意事项
    本文提供了详细的 Cadence SPB 16.5 安装步骤,包括环境配置、安装过程中的关键步骤以及常见问题的解决方案。适合初次安装或遇到问题的技术人员参考。 ... [详细]
  • 本文章利用header()函数来实现页面跳,我们介绍到404,302,301等状态跳转哦,下面有很多的状态自定的函数有需要的同学可以测试一下。heade ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 本文探讨了一个在Spring项目中常见的问题——当pom.xml文件中引入了servlet依赖但未指定其作用域为provided时导致的应用启动失败。文章详细分析了错误原因,并提供了有效的解决方案。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
author-avatar
手机用户2602932623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有