Elasticsearch7.3.2源碼環境搭建

前言

  你們好,我是一野,19年非科班本科畢業,大學期間自學編程,有幸成爲一名Android先後端開發者,沒錯我就是一名野開發,哈哈!目前和朋友成立了一家科技公司,一塊兒創業作本身的一款APP產品。使用elasticsearch已經有一段時間了,做爲一個Java爲第一語言的developer(其實目前我也只會Java),很幸運能接觸到這樣優秀的產品,爲何這麼說呢?es的優勢就不用我在此重複了,我說說個人我的想法吧。雖然目前我是在作原生Android相關開發,但我以爲我必需要在一個細分領域深刻研究,顯然我所說的細分領域即是指的數據檢索。爲何是這個領域呢,由於隨着互聯網的發展,特別是5G時代的到來,數據將爆炸試的增加,每個互聯網產品都將面臨數據檢索這個問題。馬雲說阿里是一家數據公司,誰擁有大數據,誰將擁有將來。正如羅胖所說,數據再也不是資源,而將是土壤。它孕育着科技,也滋養着商業,而最終呢,它將是將來決定一切的力量。目前,我對大數據方面的知識知之甚少,僅僅接觸過ES,也只是瞭解到皮毛,像Hadoop等大數據相關技術也並不瞭解(固然後面確定是要去學習的),目前ElasticStack做爲一整套數據處理、分析、檢索 技術棧,不正是我學習大數據技術最好的切入點嗎?在此我由衷感謝Elastic公司能開發出這樣強大好用的開源產品,下降了咱們進入大數據領域的學習成本,在我看來這就是一個機會。
  受冠狀病毒影響,春節在家呆了一個多月,也是這一個多月我完整的讀完了田雪松老師寫的《ElasticStack應用寶典》,同時也跟着阮一鳴老師在極客時間出品的「Elasticsearch核心技術與實戰」系列課程完整學習了一遍,這兩個都是基於ElasticStack7而出品的內容。經過他們,我算是大體瞭解了ES技術棧,同時對其也更加深入的理解及使用和部署、運維,至此也算是ES入門了吧。二月底,回到公司,趁閒暇時間,我決定得深刻了解ES,因而買了一本,由銘毅老師推薦的《Elasticsearch源碼解析與優化實戰》張超著,基於es6。可是沒想到,在本書的第二章搭建源碼環境時就遇到了一些小麻煩,幾經周折,終於解決了,因此想分享給你們。html

軟件環境

  • Intellij idea:2019.3
  • Gradle 5.5
  • JDK 12.0.2
  • macOS 10.15.4

準備工做

安裝:
  1. gradle和jdk,mac用戶可直接使用homebrew下載便可,Windows用戶能夠根據我上面提供的下載地址下載。mac用brew安裝後無需配置其環境變量,由於brew會自動使用symlink來管理,這個東西我後面會出專門的文章講解,這裏無需感到疑惑。
  2. elasticsearch可使用git克隆到本地,也可使用我上面提供的下載地址,下載壓縮文件並解壓到自定義的路徑下面。
注意:
  1. elasticsearch7.3.2版本源碼編譯環境,gradle 5.5版本及以上,JDK 12及以上。
  2. es的源碼版本和髮型版本必須一致,緣由是在運行源碼時須要本身去配置es的config和modules,此處直接使用發行版本的便可
  3. 具體各個版本ES源碼的編譯環境要求能夠從下載的源碼包中獲取到,具體路徑以下:elasticsearch-7.3.2/buildSrc/src/main/resources/minimumGradleVersion、minimumRuntimeVersion、minimumCompilerVersion,分別表示gradle、運行時jdk、編譯時jdk最低版本要求。

編譯源碼

好了,既然環境都準備好了,咱們就開始編譯源碼吧!
打開命令行進入到源碼的根目錄中,直接執行 ./gradlew idea 命令(早期版本可能須要執行 gradle idea),當命令行打印BUILD SUCCESSFUL 的字樣就算完成了,此時你會發現源碼根目錄會多出一個elasticsearch-7.3.2.ipr的文件,該文件是建立idea項目時自動建立來保存項目的配置信息的文件。整個過程會花5-10分鐘,甚至更久,但願小夥伴們耐心等待了。java

導入工程到idea

此時導入以前編譯爲idea項目的源碼進idea便可,進入工程後,等gradle加載完必要的依賴文件便可,以下圖:
image.png
該工程的啓動入口位於:elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java類的main函數,此時直接運行確定會報錯,由於尚未配置在啓動時必要的配置文件。node

配置工程

點擊 run——>EditConfigurations打開配置界面,新添加一個application運行的configuration,以下:
Untitled202003311114122.pnggit

Untitled20200331110647.png

  • 這裏須要特殊說明一下 VM options具體應該怎麼配置,以下:
-Des.path.home=/Users/abley/Java/elasticsearch-7.3.2/eshome
-Des.path.conf=/Users/abley/Java/elasticsearch-7.3.2/eshome/config
-Dlog4j2.disable.jmx=true
-Djava.security.policy=/Users/abley/Java/elasticsearch-7.3.2/eshome/config/elasticsearch.policy
-Des.path.plugins=/Users/abley/Java/elasticsearch-7.3.2/eshome/plugins
  • 其中的eshome是自定義的配置文件夾,我將其放入到es源碼根目錄中。須要將es對應發行版中的config、modules、plugins目錄拷貝到eshome目錄中。同時,還須要在config目錄中增長一個配置文件,elasticsearch.policy,其中的內容以下:
grant {
    permission javax.management.MBeanTruxtPermission "register";
    permission javax.management.MBeanServerPermission "createMBeanServer";
    permission java.lang.RuntimePermission "createClassLoader";
};
  • 好了,經過以上配置後,就能夠正常開啓這個工程了,網上因此資料到此也就結束了。真的是這樣嗎,很遺憾,我仍是沒法啓動這個工程,它始終會包空指針異常,那應該怎麼解決呢,下面纔是我想分享給你們的,畢竟上面的內容網上都能輕易找到。

乾貨時刻

應該是在新版本中的問題,異常以下:es6

Exception in thread "main" java.lang.NullPointerException
    at org.elasticsearch.node.InternalSettingsPreparer.checkSettingsForTerminalDeprecation(InternalSettingsPreparer.java:119)
    at org.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:91)
    at org.elasticsearch.bootstrap.Bootstrap.createEnvironment(Bootstrap.java:267)
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:306)
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
    at org.elasticsearch.cli.Command.main(Command.java:90)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92)
Refer to the log for complete error details.

點擊報錯定位到源碼位置以下:
Untitled20200331120833.pnggithub

分析

應該是output.get(settiong) 爲空,因而乎斷點伺候,果真如此,output是一個map集合,發現它的node.name確實爲null,斷點如圖:
Untitled20200331130844.png編程

這彷佛很奇怪,不該該有默認值的嗎,就像cluster.name。因而我好奇得跟了下源碼,發現是defaultNode是在這兒定義的:
elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/cli/EnvironmentAwareCommand.java
Untitled20200331153827.pngbootstrap

跟進getenv(String name)方法發現是jdk內部讀取環境變量有關的邏輯,看得我也是一頭霧水,這目前也已經超出了個人能力範圍,就此打住,有興趣的朋友能夠自行研究下,到時候記得也告訴在下學習一下,謝謝。後端

解決

難道就沒辦法解決了嗎?固然不是!解決方案有兩種。oracle

  • 方案一:若是你稍微細心你會發現,報空指針的這個方法上方的註釋描述以下:
Checks all settings values to make sure they do not have the old prompt settings. These were deprecated in 6.0.0.This check should be removed in 8.0.0.
 字面翻譯以下:
 檢查全部設置值,以確保它們沒有舊的提示設置。這些在6.0.0中已棄用。此檢查應在8.0.0中刪除。

如今明白了吧!你只要將該方法註釋掉便可。但有一個問題,它沒有默認nodeName,這實際上是有問題的。因此我推薦使用第二種解決方案。

  • 方案二:在配置文件中指定nodeName值

及在 elasticsearch-7.3.2/eshome/config/elasticsearch.yml文件中指定一個自定義的nodeName便可,此後es在運行時就能夠加載到該nodeName而不至於報空指針異常了

再遇異常

本覺得大功告成能夠一頭扎進es源碼中沒法自拔時,什麼鬼?還來!
1585642535219.jpg
再遇異常,也只能幹唄,異常代碼以下:

java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
    at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:545) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:314) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:258) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[main/:?]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[main/:?]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.2-SNAPSHOT.jar:?]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.2-SNAPSHOT.jar:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[main/:?]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader
    at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[?:?]
    at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader
分析與解決

我開動大腦強行分析,。。。。無果!!!因而乎,去網上找了一圈還真找到了解決方案,以下:
在源碼的server模塊下的 build.gradle 中82行 compileOnly project(':libs:elasticsearch-plugin-classloader') ,將compileOnly改成compile便可。這裏解釋下,compileOnly是指該依賴只在編譯時有效,運行時無效。
全TM是套路.png 既然運行時須要這個包,爲啥還用compileOnly!

至此,如今終於能夠愉快的運行es源碼了,哈哈
image.png

後記

  前面說到我和朋友們在創業作一款APP,這款APP叫「螞蟻同行」,初衷是曝光騙子,讓社會更加誠信美好。裏面有完備的IM聊天服務,真正公開透明的捐贈系統、媲美地方電視臺的「焦點」模塊、基於地理位置的信息檢索與交互等等好玩又充滿正能量的功能。這是咱們的下載地址:http://www.mytx.tech,同時也可在百度應用商店搜索到,目前正在辦理軟件著做權(這裏順帶吐槽下,軟著真是太黑了,我以爲315就因該好好打打,給錢2W,兩天就能夠辦下來,不給錢得要好幾個月,我打電話給相關部門諮詢軟著辦理事宜,相互推諉,給我個根本打不通的電話叫我諮詢,得了,最終花了500,網上找了代提交的中介,說5月8號下來,在此提醒下須要辦理軟著的小夥伴,最好在項目進行的同時就申請,否則會很慢很慢~),等軟著下來了咱們會上架到各大APPStore,感興趣的朋友能夠了解下,以爲咱們作的事情有意義也歡迎廣大朋友加入咱們。同時在ES的學習中你們能夠相互探討,個人我的wx:abley1874

相關文章
相關標籤/搜索