本文是elasticsearch源碼分析系列文檔的第一篇出爹,本篇簡單介紹了elasticsearch源碼在本機(jī)的編譯環(huán)境搭建
用到的工具有:IntelliJ Idea阶捆,JDK1.8筋粗,gradle3.5,elasticsearch-6.0.0-rc2的發(fā)行版
下載準(zhǔn)備
首先從gihut上download下來elasticsearch的主干版本夭谤,導(dǎo)入IDE后看到缺少很多依賴包搀菩,是因?yàn)檫€沒有使用gradle編譯項(xiàng)目。
首先查看elasticsearch源碼的當(dāng)前版本旦签,在類org.elasticsearch.Version#CURRENT中能看到查坪,查看到當(dāng)前master的版本是7.0.0-alpha1版本,而該版本官網(wǎng)發(fā)行版沒有顷霹,該版本的文檔頁也是剛建立咪惠,所以將ide中的代碼切換到6.0.0-rc2,因?yàn)檫@個(gè)版本是能在官網(wǎng)下載到比較新的發(fā)行版的版本,如下圖:
切換完成后淋淀,去官網(wǎng)下載6.0.0-rc2的發(fā)行版本,待會用得到覆醇。如下圖:
因?yàn)閑lasticsearch在5.X版本后默認(rèn)的編譯工具從Maven換到了Gradle朵纷。需要在本機(jī)配置好Gradle環(huán)境,如有必要可以切換國內(nèi)的源永脓。本機(jī)使用Gradle3.5和JDK1.8編譯elasticsearch袍辞。建議Gradle版本不要太高。如下圖:
開始編譯
如果現(xiàn)在就在IDE中執(zhí)行g(shù)radle idea(如果IDE是eclipse常摧,那命令就是gradle idea)搅吁,會提示,“必須在導(dǎo)入前執(zhí)行g(shù)radle idea”落午,如下圖:
cmd切換到core目錄下谎懦,運(yùn)行g(shù)radle idea命令(因?yàn)橛玫腎DE是idea,如果IDE是Eclipse溃斋,則使用Gradle eclipse命令)界拦。如下圖:
再切換到elasticsearch的根目錄下運(yùn)行g(shù)radle idea 命令,如果編譯成功的話會顯示如圖:
編譯成功后梗劫,啟動IDE享甸,idea會進(jìn)行很長時(shí)間的gradle的配置截碴,等待配置完畢后,查看項(xiàng)目如下圖蛉威,基本能看到項(xiàng)目的概覽:
啟動路徑
elasticsearch的啟動文件是elasticsearch
文件中提到了path.conf,搜索該字段找到了distribution包中的rpm/src/main/packaging/init.d/,這就是elasticsearch的初始化的地方日丹,path.conf等一些參數(shù)也是在這里被設(shè)置的。
根據(jù)啟動腳本找到main方法的入口org.elasticsearch.bootstrap.Elasticsearch蚯嫌,該方法繼承自EnvironmentAwareCommand類哲虾,這個(gè)類主要是一些參數(shù)指定與程序啟動。
而EnvironmentAwareCommand又繼承自Command類齐帚,繼承關(guān)系如下圖:
Elasticsearch中的main方法其實(shí)是調(diào)用了Command的main方法妒牙,這個(gè)方法在創(chuàng)建了了shutdown鉤子后,配置了logging对妄,最后執(zhí)行mainWithoutErrorHandling方法湘今,這個(gè)方法最后會調(diào)用EnvironmentAwareCommand的execute方法。如下圖:
EnvironmentAwareCommand環(huán)境構(gòu)造類通過execute方法構(gòu)造了elasticsearch的各種參數(shù)剪菱,如path.data摩瞎,path.home,path.logs孝常,然后通過該類的createEnv方法構(gòu)造運(yùn)行配置旗们,如圖:
這時(shí)運(yùn)行main方法后會提示錯(cuò)誤:
查看源碼可以知道es.path.conf被作為參數(shù)傳遞,如下圖:
參數(shù)配置
這一步用到了剛才下載的elasticsearch發(fā)行版本包构灸,把下載的發(fā)行版本包解壓上渴,在Run/Debug Configurations配置窗口中,配置VM options參數(shù)為:
-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是下載解壓好的發(fā)行版路徑喜颁。
設(shè)定參數(shù)后在EnvironmentAwareCommand的createEnv方法中會將設(shè)定值作為參數(shù)傳遞稠氮。
在配置好了以上三個(gè)參數(shù)后,elasticsearch的本地啟動就會讀取發(fā)行版的參數(shù)半开,插件和模塊隔披,從而成功運(yùn)行。
運(yùn)行中遇到的問題
有可能會遇到j(luò)ava安全策略的問題
access denied ("javax.management.MBeanTrustPermission" "register")
解決方法是新建一個(gè)java策略文件elasticsearch.policy
內(nèi)容是:
grant{
permission javax.management.MBeanTruxtPermission "register";
permission javax.management.MBeanServerPermission "createMBeanServer";
};
再添加jvm參數(shù):
-Djava.security.policy=/User/seymour/workspace/elasticsearch.policy
有可能會遇到module中jar包的SNAPSHOT版本問題
在org.elasticsearch.bootstrap.Security類的readPolicy()方法中,代碼探測到目前運(yùn)行的是snapshot版本检激,但是在我們下載解壓的發(fā)行版本中的elasticsearch-rest-client-6.0.0-rc2.jar確是發(fā)行版的,把這個(gè)jar包的名稱改成snapshot版本(elasticsearch-rest-client-6.0.0-rc2-SNAPSHOT)鬓长,就能正常運(yùn)行,如下圖:
節(jié)點(diǎn)不可寫
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elasticsearch-5.2.0/data/my-application]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing
則:
刪除/data目錄下的內(nèi)容
rm -rf nodes/
成功運(yùn)行
成功運(yùn)行后渺蒿,可以使用127.0.0.1:9200來測試?yán)擦∈浚瑴y試成功后就能進(jìn)行代碼的調(diào)試。