本文是elasticsearch源碼分析系列文檔的第一篇,本篇簡單介紹了elasticsearch源碼在本機的編譯環境搭建java
用到的工具備:IntelliJ Idea,JDK1.8,gradle3.5,elasticsearch-6.0.0-rc2的發行版bootstrap
首先從gihut上download下來elasticsearch的主幹版本,導入IDE後看到缺乏不少依賴包,是由於尚未使用gradle編譯項目。 安全
首先查看elasticsearch源碼的當前版本,在類org.elasticsearch.Version#CURRENT中能看到,查看到當前master的版本是7.0.0-alpha1版本,而該版本官網發行版沒有,該版本的文檔頁也是剛創建,因此將ide中的代碼切換到6.0.0-rc2,由於這個版本是能在官網下載到比較新的發行版的版本,以下圖: eclipse
切換完成後,去官網下載6.0.0-rc2的發行版本,待會用獲得。以下圖:jvm
由於elasticsearch在5.X版本後默認的編譯工具從Maven換到了Gradle。須要在本機配置好Gradle環境,若有必要能夠切換國內的源。本機使用Gradle3.5和JDK1.8編譯elasticsearch。建議Gradle版本不要過高。以下圖:elasticsearch
若是如今就在IDE中執行gradle idea(若是IDE是eclipse,那命令就是gradle idea),會提示,「必須在導入前執行gradle idea」,以下圖:ide
cmd切換到core目錄下,運行gradle idea命令(由於用的IDE是idea,若是IDE是Eclipse,則使用Gradle eclipse命令)。以下圖:工具
再切換到elasticsearch的根目錄下運行gradle idea 命令,若是編譯成功的話會顯示如圖:源碼分析
編譯成功後,啓動IDE,idea會進行很長時間的gradle的配置,等待配置完畢後,查看項目以下圖,基本能看到項目的概覽:測試
elasticsearch的啓動文件是elasticsearch 文件中提到了path.conf,搜索該字段找到了distribution包中的rpm/src/main/packaging/init.d/,這就是elasticsearch的初始化的地方,path.conf等一些參數也是在這裏被設置的。
根據啓動腳本找到main方法的入口org.elasticsearch.bootstrap.Elasticsearch,該方法繼承自EnvironmentAwareCommand類,這個類主要是一些參數指定與程序啓動。 而EnvironmentAwareCommand又繼承自Command類,繼承關係以下圖:
Elasticsearch中的main方法實際上是調用了Command的main方法,這個方法在建立了了shutdown鉤子後,配置了logging,最後執行mainWithoutErrorHandling方法,這個方法最後會調用EnvironmentAwareCommand的execute方法。以下圖:
EnvironmentAwareCommand環境構造類經過execute方法構造了elasticsearch的各類參數,如path.data,path.home,path.logs,而後經過該類的createEnv方法構造運行配置,如圖:
這時運行main方法後會提示錯誤:
查看源碼能夠知道es.path.conf被做爲參數傳遞,以下圖:
這一步用到了剛纔下載的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方法中會將設定值做爲參數傳遞。
在配置好了以上三個參數後,elasticsearch的本地啓動就會讀取發行版的參數,插件和模塊,從而成功運行。
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
複製代碼
在org.elasticsearch.bootstrap.Security類的readPolicy()方法中,代碼探測到目前運行的是snapshot版本,可是在咱們下載解壓的發行版本中的elasticsearch-rest-client-6.0.0-rc2.jar確是發行版的,把這個jar包的名稱改爲snapshot版本(elasticsearch-rest-client-6.0.0-rc2-SNAPSHOT),就能正常運行,以下圖:
成功運行後,可使用127.0.0.1:9200來測試啦,測試成功後就能進行代碼的調試。