想读ElasticSearch源码,从git上拉取代码,导入idea。就是这么简单的一个想法,记录一下过程。
1.准备
1.1哪个版本?
ElasticSearch版本更新真的是很快,每个版本都有大量的新特性,想读源码之前总得闹清楚,想读哪个版本的吧?
本文用5.6.16 为什么是这个版本?
(1)5.x版本,这个版本应该是最新的,公司的ES集群还在5.x,没有进行大的升级
(2)其他版本,导入过程bug满天飞,主要是国内网络,很多包不能下载
1.2环境准备
(1)idea版本:2018.2.5
(2)elasticsearch git地址:https://github.com/elastic/elasticsearch 5.6.16版本的ElasticSearch需要从tag中拉取,如下图示
(3)jdk 版本:版本选择,看这里https://www.elastic.co/guide/en/elasticsearch/reference/5.6/_installation.html
(4)gradle版本:选定分支后,在github上查找“elasticsearch/gradle/wrapper/gradle-wrapper.properties”目录,确定gradle版本
(5)elasticsearch的压缩包,https://www.elastic.co/cn/downloads/past-releases/# 选择对应和源码版本一致的zip文件,如果官网下载太慢,有个国内的镜像网站:https://thans.cn/mirror/elasticsearch.html
1.3注意事项
(1)elasticsearch版本发生变化时,jdk和gradle版本也会发生变化
(2)gradle注意使用国内阿里镜像(网上很多配置)
(3)gradle和idea配置的时候,记得使用自定义的gradle,同时offline work不选,如下图示:
2.源码编译及导入Idea
这个过程,参考教你编译调试Elasticsearch 6.3.2源码即可。
3.Bug&Execption
(1)修正一下教你编译调试Elasticsearch 6.3.2源码小问题:
-Des.path.home=D:\BDLTools\Elastic\elasticsearch\elasticsearch-5.6.16
-Des.path.conf=D:\BDLTools\Elastic\elasticsearch\elasticsearch-5.6.16\config
-Dlog4j2.disable.jmx=true
-Djava.security.policy=D:\BDLTools\Elastic\elasticsearch\elasticsearch-5.6.16\config\java.policy
-Des.path.home=指向zip文件解压后的地址,不必要在源码中新建home文件夹
(2)按照上述流程,走完,启动ES,发现如下问题
[2020-01-09T18:46:05,714][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[main/:?]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[main/:?]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[main/:?]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[main/:?]
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1967) ~[?:1.8.0_231]
at org.elasticsearch.bootstrap.Security.readPolicy(Security.java:220) ~[main/:?]
at org.elasticsearch.bootstrap.Security.getPluginPermissions(Security.java:177) ~[main/:?]
at org.elasticsearch.bootstrap.Security.configure(Security.java:119) ~[main/:?]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:228) ~[main/:?]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[main/:?]
... 6 more
单步调试,发现问题:elasticsearch\core\src\main\java\org\elasticsearch\bootstrap\Security.java,修改如下
//final String esVersion = Version.CURRENT + (Build.CURRENT.isSnapshot() ? "-SNAPSHOT" : "");
final String esVersion = Version.CURRENT.toString();
同时修改elasticsearch\core\src\main\java\org\elasticsearch\Version.java,应该是v_5_6_17未发布,需要修正一下,如下所示:
//public static final Version CURRENT = V_5_6_17_UNRELEASED;
public static final Version CURRENT = V_5_6_16;
(3)启动ElasticSearch,正常
打开,http://localhost:9200/,如下所示,之后可以阅读代码了