關(guān)鍵詞:Maven
問(wèn)題復(fù)現(xiàn)
使用Java連接es報(bào)錯(cuò)
Exception in thread "main" java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
at org.elasticsearch.common.xcontent.json.JsonXContent.<clinit>(JsonXContent.java:57)
at org.elasticsearch.common.xcontent.XContentType$1.xContent(XContentType.java:56)
at org.elasticsearch.common.xcontent.XContentHelper.toXContent(XContentHelper.java:348)
at org.elasticsearch.client.RequestConverters.createEntity(RequestConverters.java:686)
at org.elasticsearch.client.RequestConverters.createEntity(RequestConverters.java:681)
at org.elasticsearch.client.RequestConverters.search(RequestConverters.java:388)
at org.elasticsearch.client.RestHighLevelClient.lambda$search$4(RestHighLevelClient.java:1094)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1760)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1734)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1696)
at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:1092)
原因是elasticsearch jar包里面的jackson-core的jar包和其他jar包產(chǎn)生沖突,其他jar也引用了jackson-core裳涛,導(dǎo)致有多個(gè)jackson-core待逞,程序里面調(diào)用的jackson-core沒(méi)有FAIL_ON_SYMBOL_HASH_OVERFLOW這個(gè)字段
Maven jar包沖突原理
假設(shè)pom中引入了A和E兩個(gè)jar包木缝,A和E各自也有需要引入的jar包
A->B->C->D(15.0):A中包含對(duì)B的依賴(lài)晌端,B中包含對(duì)C的依賴(lài)讨阻,C中包含對(duì)D1的依賴(lài)偎蘸,D1的version為15.0
E->F->D(16.0):E中包含對(duì)F的依賴(lài)料按,F(xiàn)包含對(duì)D2的依賴(lài)奄侠,假設(shè)是D2是同一個(gè)日志jar包,version為16.0
由于A载矿,E都引用了D垄潮,但是D的版本不同,產(chǎn)生jar包沖突恢准,此時(shí)Maven對(duì)于同一個(gè)jar包只會(huì)保留一個(gè)魂挂,Maven的保留規(guī)則為:
1.最短路徑優(yōu)先
如果有多個(gè)路徑引用到D,就選取其中最短的路徑對(duì)應(yīng)的那個(gè)D作為最終的D引入項(xiàng)目馁筐,這點(diǎn)很容易理解涂召,比如有個(gè)jar比如D是直接在pom里面引用的,它的路徑長(zhǎng)度就是1敏沉,它肯定比引其他包導(dǎo)致被D被關(guān)聯(lián)引入的更符合使用的需求果正。2.最先聲明優(yōu)先
如果路徑長(zhǎng)度都相同,則以最先聲明的為準(zhǔn)盟迟,就是pom文件哪個(gè)寫(xiě)在上面秋泳,如果路徑長(zhǎng)度相同,只能憑借前后聲明拼運(yùn)氣了
使用Maven helper分析沖突
下載Maven helper插件
安裝好后在工程目錄中雙擊選中pom文件攒菠,就可以看到Dependency Analyzer
點(diǎn)擊進(jìn)入分析
左邊框內(nèi)每一個(gè)jar包都是沖突項(xiàng)迫皱,右邊展示了具體該jar如何沖突,把它的來(lái)源路徑全部展示出來(lái),以jackson-core為例卓起,有6個(gè)來(lái)源路徑和敬,其中5個(gè)是紅色的代表被Maven沖突規(guī)則去除的,有一個(gè)白色的是最終被項(xiàng)目引入的戏阅,由此也說(shuō)明Maven會(huì)通過(guò)簡(jiǎn)單規(guī)則將同一個(gè)jar包的僅一個(gè)版本引入項(xiàng)目昼弟。最終被引入的是hadoop-client這條路徑的,原因是該路徑最短只有2奕筐,spark_hive_2.11太長(zhǎng)為3舱痘,而同為2的elasticsearch由于在pom中寫(xiě)在了hadoop-client的下面導(dǎo)致也被去除了。
解決方案
很明顯應(yīng)該保留下elasticsearch的jackson-core离赫,由于已經(jīng)知道了Maven的沖突保留規(guī)則芭逝,因此本例中可以直接把elasticsearch在pom中寫(xiě)到hadoop-client的上面
更改后在沖突UI中點(diǎn)擊Reimport即可重新查看
此時(shí)elasticsearch變?yōu)榘咨蔀樽罱K保留下來(lái)的路徑,重新打包FAIL_ON_SYMBOL_HASH_OVERFLOW問(wèn)題解決笆怠。
以上只是搞正確了最后保留下來(lái)的勝利者正確铝耻,并沒(méi)有避免沖突,基于沖突UI進(jìn)一步操作蹬刷,右鍵需要移除的jar包點(diǎn)擊Exclude即可以避免沖突
點(diǎn)擊之后紅色的消失,同時(shí)在pom里面自動(dòng)加上了Exclude語(yǔ)句