ElasticSearch本地源码调试
转自:https://www.felayman.com/articles/2017/11/10/1510291087246.html
Elasticsearch版本为 5.5.1
1. 源码下载
- git clone https://github.com/elastic/elasticsearch
2. 分支切换
- git checkout v5.5.1
3 运行gradle idea,gradle build -x test
如果运行gradle idea会报如下错误:请修改elasticsearch源文件中的BuildPlugin.groory文件中的findJavaHome()方法的第一行代码,源码为 String javaHome = System.getenv(‘JAVA_HOME’),修改为String javaHome = “你的JAVA_HOME地址,输入echo $JAVA_HOME($)”
1 | What went wrong: |
这里我使用的是idea工具来调试源码,因此先不要用idea导入该项目,而是进入到下载的elasticsearch目录下,执行gradle idea,等待漫长的依赖下载,等待下载完成后 执行 gradle build -x test 对源码进行编译,等待编译完成.
4. 注释掉jar hell相关代码
- 全局搜索JarHell.checkJarHell,以及checkJarHell,注释掉相应的代码,否则运行会报错
5. 配置Edit Configuation
- mainClass为 org.elasticsearch.bootstrap.Elasticsearch VM options为
- Des.path.home=/Users/admin/elk/elasticsearch-5.5.0 -Dlog4j2.disable.jmx=true
6. 运行org.elasticsearch.bootstrap.Elasticsearch中的main方法
1 | [2017-07-11T22:00:08,396][INFO ][o.e.n.Node ] [] initializing ... |
可能遇到的异常
ERROR: the system property [es.path.conf] must be set
原因是没有指定es.path.conf,设置-Des.path.conf=你调试源码版本对应的conf目录
Exception in thread “main” java.lang.IllegalStateException: path.home is not configured
原因是因为没有为elasticsearch配置path.home参数,可以在Edit Configuation中设置虚拟机参数:-Des.path.home=你下载的对应的elasticsearch的安装目录,这么做的原因
是elasticsearch在启动中会加载一些默认配置以及插件,我们直接加载elasticsearch安装目录下的配置和插件即可,后面会在源码中体现2017-06-23 14:00:44,760 main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
原因是因为elasticsearch在启动过程中使用到了jmx,我们这里禁止使用即可,配置也是在Edit Configuation中设置虚拟机参数 -Dlog4j2.disable.jmx=true
org.elasticsearch.bootstrap.StartupException: org.elasticsearch.bootstrap.BootstrapException: java.lang.IllegalStateException: jar hell!或Classname: org.elasticsearch.search.aggregations.matrix.MatrixAggregationPlugin due to jar hell
原因是因为elasticsearch中大量存在一个类或一个资源文件存在多个jar中,我们注释掉相应代码即可,主要是PluginsService中374行的JarHell.checkJarHell(union)以及
Bootstrap中220行的JarHell.checkJarHell(),最简单的方式就是将JarHell.checkJarHell()中的方法体注释掉org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: plugin [aggs-matrix-stats] is incompatible with version [7.0.0-alpha1]; was designed for version [5.6.1]
原因是一般情况下我们调试的源码非某个发布版本,有些配置项并未发布,我们的配置与当前代码的版本匹配不上,这个时候我们需要将调试的源码设置成某个发布版本,一般来说,Elasticsearch每发布
一个稳定版本,都会有一个对应的tag,我们进入到ES源码目录下执行git tag, 我这里调试的版本为v5.6.1,所以执行git checkout v5.6.1,切换到v5.6.1tag.
另一种源码调试方式:远程调试
如果上面第五个报错之后解决不了无法继续进行,可以选择这种方式:
在 Elasticsearch 源码目录下打开 CMD,输入下面的命令启动一个 debug 实例
1 | gradle run --debug-jvm |
如果启动失败可能需要先执行 gradle clean
再 gradle run --debug-jvm
或者 先退出 IDEA
在 IDEA 中打开 Edit Configurations
,添加 remote
配置 host 和 port
点击 debug,浏览器访问 http://localhost:9200/
,即可看到ES返回的信息
随机调试一下, 打开 elasticsearch/server/src/main/org/elasticsearch/rest/action/cat
下的 RestHealthAction
类,在第 54 行出设置一个断点,然后浏览器访问 http://localhost:9200/_cat/health
,可以看到断点已经捕获到该请求了
运行成功,可以开始设置断点进行其他调试
源码本地编译工程包
在es源码根目录,执行 gradle assemble 命令,编译好之后工程ZIP包位于下图位置。
其他可能遇到的问题
1. 错误信息如下
1 | JAVA8_HOME required to run tasks gradle |
配置环境变量 JAVA8_HOME
,值为 JDK8 的安装目录
2. 错误信息如下
1 | [2018-08-22T13:07:23,197][INFO ][o.e.t.TransportService ] [EFQliuV] publish_address {10.100.99.118:9300}, bound_addresses {[::]:9300} |
在 Edit Configurations
的 VM options
加入下面配置
-Xms2g
-Xmx2g