IntelliJ IDEA中编译并调试Elasticsearch源码
我的编译环境:
- MacOS Mojave 10.14.6
- JDK 14.0.2(重要)
- Gradle 6.6.1(重要)
- Git 2.28.0
- IntelliJ IDEA 2020.2.3
-
安装编译源码时使用的JDK
-
安装什么版本的JDK
编译不同版本的Elasticsearch源码,需要本机安装该版本的Elasticsearch源码要求的最低版本的JDK。Elasticsearch与JVM之间的版本对应关系,请查阅Elasticsearch官方提供的说明文档:
https://www.elastic.co/cn/support/matrix#matrix_jvm
-
如何安装
请自行借助搜索引擎解决,这里就不赘述了。
-
-
获取Elasticsearch源码
Elasticsearch源码在Github上的仓库访问地址:https://github.com/elastic/elasticsearch
获取Elasticsearch源码有两种方式:
-
网页下载(不推荐)
你可以直接通过网页下载zip格式的源码包,如下图所示:
-
Git克隆(推荐)
git clone https://github.com/elastic/elasticsearch.git
注意:
一般Mac平台下都会自带Git,若你当前使用的是Linux或Windows平台,那么请先安装Git。
-
Linux
yum install git 或apt-get install git
-
Windows
请自行借助搜索引擎根据搜索关键词“windows安装git”查找相关博客,从而完成Git的安装。
在命令行窗口输入如下命令验证Git安装成功:
git --version
如果能够看到如下类似信息,则表明Git已安装成功。
-
-
切换源码版本
首先你需要确认你想要编译的Elasticsearch源码的版本,这里我选择编译Elasticsearch源码的最新版。在我编写这篇笔记时,当前Elasticsearch源码的最新版8.0.0(beta版,非正式版)。确认编译版本之后,你需要将Elasticsearch源码切换到该版本对应的Git分支下,具体操作如下所示:
cd /Users/yida/github_space/elasticsearch git checkout master
注意:
上面/Users/yida/github_space/elasticsearch是我的Elasticsearch源码克隆后的存储根目录,如果你想要编译Elasticsearch 6.0源码,那么请将上面的git checkout master更换为git checkout origin/6.0。
-
安装Gradle
由于Elasticsearch项目目前是选择使用Gradle进行代码管理,若想要编译Elasticsearch源码,则必须先本机安装Gradle。
Gradle官网地址:https://gradle.org/,如下图所示,点击Gradle Releases菜单进入Gradle的历史版本下载页面,
在该页面,选择你想要安装的Gradle版本,点击binary-only下载Gradle安装包。下载完成之后,解压Gradle安装包到任意目录,然后配置Gradle环境变量,配置示例如下所示:
GRADLE_HOME=/Users/yida/gradle-6.6.1 GRADLE_USER_HOME=/Users/yida/Gradle-Repository #在Path中追加$GRADLE_HOME/bin PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$ANT_HOME/bin/:$MVN_HOME/bin:$JRE_HOME/bin:$MYSQL_HOME/bin:$MYSQL_HOME/support-files:$GO_HOME/bin:$GOROOT/bin:$GRADLE_HOME/bin:$SCALA_HOME/bin:$PYTHON_HOME/bin:$ZK_HOME/bin:$NODE_HOME/bin:$NODE_PATH/bin:$PATH:. export GRADLE_HOME export GRADLE_USER_HOME
注意:
其中GRADLE_USER_HOME配置的是Gradle的本地仓库目录,类似于Maven的本地仓库目录,此目录请自己事先创建好。
Gradle环境变量配置好之后,请执行source ~/.bash_profile命令使其立即生效。最后执行gradle -v验证本机Gradle是否安装成功,若执行之后,能够看到如下图所示的信息,则表明本机Gradle已经安装成功。
-
生成IDEA项目
在Elasticsearch源码的根目录下执行如下所示的命令以生成IDEA项目供后续导入:
gradle idea
-
源码导入IDEA
-
设置项目JDK
-
IDEA中添加Elasticsearch的Debug配置
点击顶部的“Add Configuration”添加Elasticsearch的Debug配置,具体操作如下图所示:
首先在左侧的Remote下添加一项Debug配置,具体配置参数如上图的右侧标注所示进行填写。其中Name参数是可以随意自定义的,只是一个显示名称而已。Debugger Mode(调试模式)这里务必选择Listen to remove JVM,记得勾选Auto restart(自动重启)。Host表示你想要连接的Elasticsearch Server的远程主机IP或域名,这里我们是在本机的IDEA中运行Elasticsearch源码来启动Elasticsearch Server,故这里直接填写localhost即可。如果你的Elasticsearch Server服务是在远程的某一台机器上启动的,那么请填写该远程机器的IP或域名。Port表示运行Elasticsearch Server服务的主机所监听的端口,可以随意自定义,只要不发生端口冲突即可。Command line arguments for remote JVM(远程JVM的命令行参数)的填写内容是固定模式,唯一需要注意的是里面的address中的Host需要与上面的标号4处的Host保持一致,以及address中的端口号需要与上面的标号5处的Port保持一致。
-agentlib:jdwp=transport=dt_socket,server=n,address=localhost:5005,suspend=y,onthrow=<FQ exception class name>,onuncaught=<y/n>
当然如果你的Elasticsearch Server是运行在远程机器上,那么你还需要在Elasticsearch根目录下的bin目录下的elasticsearch脚本(Windows平台下就是elasticsearch.bat)中添加一些远程Debug参数,配置示例如下所示:
找到elasticsearch脚本,使用vi进行编辑
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=y \
Debug参数在elasticsearch脚本中的具体放置位置请参考下面截图:
-
禁用xpack
为了调试以及测试方便,在阅读代码阶段,建议禁用xpack功能。xpack插件主要是用来为你的Elasticsearch集群增加安全验证功能,以保证你的Elasticsearch集群安全。在生产环境下,有条件的话(xpack是Elasticsearch的收费插件),建议还是开启xpack功能。
-
在IDEA中启动Debug
请点击IDEA顶部菜单栏的小臭虫图标,启动Debug。
-
在IDEA中启动Elasticsearch服务
在命令行窗口下,或者IDEA中的Terminal窗口下,执行gradle run --debug-jvm命令以在IDEA中启动Elasticsearch Server,你可以如下图所示打开IDEA中的Terminal窗口:
如果能够看到如下图所示的打印信息,则表明Elasticsearch Server已经在IDEA中启动成功了:
你也可以通过在浏览器中输入localhost:9200,然后回车,以验证Elasticsearch Server是否已在本机IDEA中启动成功。如果你能在浏览器中看到如下图所示的返回信息,则表明Elasticsearch Server已经在IDEA中启动成功。
至此,你就可以开始在源码中打断点,然后通过浏览器或者Postman或者使用Elasticsearch Client API编写Java(当然其他常见编程语言也可以)程序发起Elasticsearch的HTTP请求到本机的Elasticsearch Server,只要你在Elasticsearch源码中org.elasticsearch.rest包下的RestController类的dispatchRequest函数处打个断点,即可开始Elasticsearch的源码调试。
Elasticsearch常用的HTTP接口简单举几个例子:
#分词 localhost:9200/_analyze #查看分配在每个数据节点的shard数量,和节点的磁盘空间 localhost:9200/_cat/allocation #查看集群的健康状态 localhost:9200/_cat/health #查看集群索引的详细信息 localhost:9200/_cat/indices
关于Elasticsearch的其他HTTP接口,请查阅Elasticsearch官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html。
如果你想要对Elasticsearch Server的启动过程进行源码Debug,那么你需要先通过jps查看刚刚通过gradle run --debug-jvm命令启动的进程对于的进程ID,先将这些进程杀死,具体需要杀死哪些进程,请参考下面截图:
然后在Elasticsearch源码中org.elasticsearch.bootstrap包下的Elasticsearch类的main函数处打下断点,再按顺序执行第10步和第11步即可。
鸣谢:益达_兰小伟
注意:本文归作者所有,未经作者允许,不得转载