[1]elasticsearch源碼編譯

本文是elasticsearch源碼分析系列文檔的第一篇,本篇簡單介紹了elasticsearch源碼在本機的編譯環境搭建java

用到的工具備:IntelliJ Idea,JDK1.8,gradle3.5,elasticsearch-6.0.0-rc2的發行版bootstrap

下載準備

首先從gihut上download下來elasticsearch的主幹版本,導入IDE後看到缺乏不少依賴包,是由於尚未使用gradle編譯項目。 安全

導入IDE後看到缺乏不少包.png

首先查看elasticsearch源碼的當前版本,在類org.elasticsearch.Version#CURRENT中能看到,查看到當前master的版本是7.0.0-alpha1版本,而該版本官網發行版沒有,該版本的文檔頁也是剛創建,因此將ide中的代碼切換到6.0.0-rc2,由於這個版本是能在官網下載到比較新的發行版的版本,以下圖: eclipse

在ide中切換到6.0版本.png

切換完成後,去官網下載6.0.0-rc2的發行版本,待會用獲得。以下圖:jvm

官網下載6.0.0-rc2的發行版.png

由於elasticsearch在5.X版本後默認的編譯工具從Maven換到了Gradle。須要在本機配置好Gradle環境,若有必要能夠切換國內的源。本機使用Gradle3.5和JDK1.8編譯elasticsearch。建議Gradle版本不要過高。以下圖:elasticsearch

修改gradle倉庫配置.png

開始編譯

若是如今就在IDE中執行gradle idea(若是IDE是eclipse,那命令就是gradle idea),會提示,「必須在導入前執行gradle idea」,以下圖:ide

提示必須在導入idea以前執行gradle idea命令.png

cmd切換到core目錄下,運行gradle idea命令(由於用的IDE是idea,若是IDE是Eclipse,則使用Gradle eclipse命令)。以下圖:工具

本地編譯elasticsearch成功.png

再切換到elasticsearch的根目錄下運行gradle idea 命令,若是編譯成功的話會顯示如圖:源碼分析

在elasticsearch根目錄下編譯成功.png

編譯成功後,啓動IDE,idea會進行很長時間的gradle的配置,等待配置完畢後,查看項目以下圖,基本能看到項目的概覽:測試

t-8編譯好後導入IDE結果.png

啓動路徑

elasticsearch的啓動文件是elasticsearch 文件中提到了path.conf,搜索該字段找到了distribution包中的rpm/src/main/packaging/init.d/,這就是elasticsearch的初始化的地方,path.conf等一些參數也是在這裏被設置的。

根據啓動腳本找到main方法的入口org.elasticsearch.bootstrap.Elasticsearch,該方法繼承自EnvironmentAwareCommand類,這個類主要是一些參數指定與程序啓動。 而EnvironmentAwareCommand又繼承自Command類,繼承關係以下圖:

啓動類的繼承關係.png

Elasticsearch中的main方法實際上是調用了Command的main方法,這個方法在建立了了shutdown鉤子後,配置了logging,最後執行mainWithoutErrorHandling方法,這個方法最後會調用EnvironmentAwareCommand的execute方法。以下圖:

Command類中的main方法.png

EnvironmentAwareCommand環境構造類經過execute方法構造了elasticsearch的各類參數,如path.data,path.home,path.logs,而後經過該類的createEnv方法構造運行配置,如圖:

EnvironmentAwareCommand類的execute方法.png

EnvironmentAwareCommand類的createEnv方法.png

這時運行main方法後會提示錯誤:

執行main方法後提示錯誤找不到es.path.conf.png

查看源碼能夠知道es.path.conf被做爲參數傳遞,以下圖:

t-11配置的Des.path.conf被做爲參數傳遞.png

參數配置

這一步用到了剛纔下載的elasticsearch發行版本包,把下載的發行版本包解壓,在Run/Debug Configurations配置窗口中,配置VM options參數爲:

-Des.path.conf=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Dlog4j2.disable.jmx=true
複製代碼

路徑D:\idea\workspace\elasticsearch\distribution\src\main\resources是下載解壓好的發行版路徑。

設定參數後在EnvironmentAwareCommand的createEnv方法中會將設定值做爲參數傳遞。

配置啓用發行版的配置和插件運行.png

在配置好了以上三個參數後,elasticsearch的本地啓動就會讀取發行版的參數,插件和模塊,從而成功運行。

運行中遇到的問題

有可能會遇到java安全策略的問題

access denied ("javax.management.MBeanTrustPermission" "register") 解決方法是新建一個java策略文件elasticsearch.policy

內容是:

grant{
	permission javax.management.MBeanTruxtPermission "register";
	permission javax.management.MBeanServerPermission "createMBeanServer";
};
複製代碼

再添加jvm參數:

-Djava.security.policy=/User/seymour/workspace/elasticsearch.policy
複製代碼
有可能會遇到module中jar包的SNAPSHOT版本問題

在org.elasticsearch.bootstrap.Security類的readPolicy()方法中,代碼探測到目前運行的是snapshot版本,可是在咱們下載解壓的發行版本中的elasticsearch-rest-client-6.0.0-rc2.jar確是發行版的,把這個jar包的名稱改爲snapshot版本(elasticsearch-rest-client-6.0.0-rc2-SNAPSHOT),就能正常運行,以下圖:

jar包版本問題.png

成功運行

成功運行後,可使用127.0.0.1:9200來測試啦,測試成功後就能進行代碼的調試。

成功運行.png
相關文章
相關標籤/搜索