你們好,我是一野,19年非科班本科畢業,大學期間自學編程,有幸成爲一名Android先後端開發者,沒錯我就是一名野開發,哈哈!目前和朋友成立了一家科技公司,一塊兒創業作本身的一款APP產品。使用elasticsearch已經有一段時間了,做爲一個Java爲第一語言的developer(其實目前我也只會Java),很幸運能接觸到這樣優秀的產品,爲何這麼說呢?es的優勢就不用我在此重複了,我說說個人我的想法吧。雖然目前我是在作原生Android相關開發,但我以爲我必需要在一個細分領域深刻研究,顯然我所說的細分領域即是指的數據檢索。爲何是這個領域呢,由於隨着互聯網的發展,特別是5G時代的到來,數據將爆炸試的增加,每個互聯網產品都將面臨數據檢索這個問題。馬雲說阿里是一家數據公司,誰擁有大數據,誰將擁有將來。正如羅胖所說,數據再也不是資源,而將是土壤。它孕育着科技,也滋養着商業,而最終呢,它將是將來決定一切的力量。目前,我對大數據方面的知識知之甚少,僅僅接觸過ES,也只是瞭解到皮毛,像Hadoop等大數據相關技術也並不瞭解(固然後面確定是要去學習的),目前ElasticStack做爲一整套數據處理、分析、檢索 技術棧,不正是我學習大數據技術最好的切入點嗎?在此我由衷感謝Elastic公司能開發出這樣強大好用的開源產品,下降了咱們進入大數據領域的學習成本,在我看來這就是一個機會。
受冠狀病毒影響,春節在家呆了一個多月,也是這一個多月我完整的讀完了田雪松老師寫的《ElasticStack應用寶典》,同時也跟着阮一鳴老師在極客時間出品的「Elasticsearch核心技術與實戰」系列課程完整學習了一遍,這兩個都是基於ElasticStack7而出品的內容。經過他們,我算是大體瞭解了ES技術棧,同時對其也更加深入的理解及使用和部署、運維,至此也算是ES入門了吧。二月底,回到公司,趁閒暇時間,我決定得深刻了解ES,因而買了一本,由銘毅老師推薦的《Elasticsearch源碼解析與優化實戰》張超著,基於es6。可是沒想到,在本書的第二章搭建源碼環境時就遇到了一些小麻煩,幾經周折,終於解決了,因此想分享給你們。html
好了,既然環境都準備好了,咱們就開始編譯源碼吧!
打開命令行進入到源碼的根目錄中,直接執行 ./gradlew idea 命令(早期版本可能須要執行 gradle idea),當命令行打印BUILD SUCCESSFUL 的字樣就算完成了,此時你會發現源碼根目錄會多出一個elasticsearch-7.3.2.ipr的文件,該文件是建立idea項目時自動建立來保存項目的配置信息的文件。整個過程會花5-10分鐘,甚至更久,但願小夥伴們耐心等待了。java
此時導入以前編譯爲idea項目的源碼進idea便可,進入工程後,等gradle加載完必要的依賴文件便可,以下圖:
該工程的啓動入口位於:elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java類的main函數,此時直接運行確定會報錯,由於尚未配置在啓動時必要的配置文件。node
點擊 run——>EditConfigurations打開配置界面,新添加一個application運行的configuration,以下:git
-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
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.
點擊報錯定位到源碼位置以下:github
應該是output.get(settiong) 爲空,因而乎斷點伺候,果真如此,output是一個map集合,發現它的node.name確實爲null,斷點如圖:編程
這彷佛很奇怪,不該該有默認值的嗎,就像cluster.name。因而我好奇得跟了下源碼,發現是defaultNode是在這兒定義的:
elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/cli/EnvironmentAwareCommand.javabootstrap
跟進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,這實際上是有問題的。因此我推薦使用第二種解決方案。
及在 elasticsearch-7.3.2/eshome/config/elasticsearch.yml文件中指定一個自定義的nodeName便可,此後es在運行時就能夠加載到該nodeName而不至於報空指針異常了
本覺得大功告成能夠一頭扎進es源碼中沒法自拔時,什麼鬼?還來!
再遇異常,也只能幹唄,異常代碼以下:
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是指該依賴只在編譯時有效,運行時無效。 既然運行時須要這個包,爲啥還用compileOnly!
至此,如今終於能夠愉快的運行es源碼了,哈哈
前面說到我和朋友們在創業作一款APP,這款APP叫「螞蟻同行」,初衷是曝光騙子,讓社會更加誠信美好。裏面有完備的IM聊天服務,真正公開透明的捐贈系統、媲美地方電視臺的「焦點」模塊、基於地理位置的信息檢索與交互等等好玩又充滿正能量的功能。這是咱們的下載地址:http://www.mytx.tech,同時也可在百度應用商店搜索到,目前正在辦理軟件著做權(這裏順帶吐槽下,軟著真是太黑了,我以爲315就因該好好打打,給錢2W,兩天就能夠辦下來,不給錢得要好幾個月,我打電話給相關部門諮詢軟著辦理事宜,相互推諉,給我個根本打不通的電話叫我諮詢,得了,最終花了500,網上找了代提交的中介,說5月8號下來,在此提醒下須要辦理軟著的小夥伴,最好在項目進行的同時就申請,否則會很慢很慢~),等軟著下來了咱們會上架到各大APPStore,感興趣的朋友能夠了解下,以爲咱們作的事情有意義也歡迎廣大朋友加入咱們。同時在ES的學習中你們能夠相互探討,個人我的wx:abley1874