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

之前在做项目的时候需要在 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地址,有空研究一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容