IntelliJ IDEA中编译并调试Elasticsearch源码

Java源码网 8月前 ⋅ 487 阅读 0 下载

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
  1. 安装编译源码时使用的JDK

    • 安装什么版本的JDK

      编译不同版本的Elasticsearch源码,需要本机安装该版本的Elasticsearch源码要求的最低版本的JDK。Elasticsearch与JVM之间的版本对应关系,请查阅Elasticsearch官方提供的说明文档:

      https://www.elastic.co/cn/support/matrix#matrix_jvm

    • 如何安装

      请自行借助搜索引擎解决,这里就不赘述了。

  2. 获取Elasticsearch源码

    Elasticsearch源码在Github上的仓库访问地址:https://github.com/elastic/elasticsearch

    获取Elasticsearch源码有两种方式:

    • 网页下载(不推荐)

      你可以直接通过网页下载zip格式的源码包,如下图所示:

      image-20201120092128967.png

    • 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已安装成功。
    image-20201120093009176.png

  3. 切换源码版本

    首先你需要确认你想要编译的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。

  4. 安装Gradle

    由于Elasticsearch项目目前是选择使用Gradle进行代码管理,若想要编译Elasticsearch源码,则必须先本机安装Gradle。

    Gradle官网地址:https://gradle.org/,如下图所示,点击Gradle Releases菜单进入Gradle的历史版本下载页面,

    image-20201120100503828.png

    在该页面,选择你想要安装的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已经安装成功。

    image-20201120101935473.png

  5. 生成IDEA项目

    在Elasticsearch源码的根目录下执行如下所示的命令以生成IDEA项目供后续导入:

    gradle idea
    
  6. 源码导入IDEA

    image-20201120102108963.png

    image-20201120102224392.png

  7. 设置项目JDK

    image-20201120122750407.png

    image-20201120122828073.png

    image-20201120123009854.png

    image-20201120123052035.png

  8. IDEA中添加Elasticsearch的Debug配置

    点击顶部的“Add Configuration”添加Elasticsearch的Debug配置,具体操作如下图所示:

    image-20201120102850101.png

    首先在左侧的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脚本中的具体放置位置请参考下面截图:

    image-20201120114514825.png

  9. 禁用xpack

    为了调试以及测试方便,在阅读代码阶段,建议禁用xpack功能。xpack插件主要是用来为你的Elasticsearch集群增加安全验证功能,以保证你的Elasticsearch集群安全。在生产环境下,有条件的话(xpack是Elasticsearch的收费插件),建议还是开启xpack功能。

    image-20201120111101664.png

    image-20201120111243783.png

  10. 在IDEA中启动Debug

    请点击IDEA顶部菜单栏的小臭虫图标,启动Debug。

    image-20201120111759610.png

  11. 在IDEA中启动Elasticsearch服务

    在命令行窗口下,或者IDEA中的Terminal窗口下,执行gradle run --debug-jvm命令以在IDEA中启动Elasticsearch Server,你可以如下图所示打开IDEA中的Terminal窗口:

    image-20201120105649284.png

    image-20201120110001316.png

    如果能够看到如下图所示的打印信息,则表明Elasticsearch Server已经在IDEA中启动成功了:

    image-20201120112045326.png

    你也可以通过在浏览器中输入localhost:9200,然后回车,以验证Elasticsearch Server是否已在本机IDEA中启动成功。如果你能在浏览器中看到如下图所示的返回信息,则表明Elasticsearch Server已经在IDEA中启动成功。

    image-20201120112412785.png

    至此,你就可以开始在源码中打断点,然后通过浏览器或者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,先将这些进程杀死,具体需要杀死哪些进程,请参考下面截图:

    image-20201120123807443.png

    然后在Elasticsearch源码中org.elasticsearch.bootstrap包下的Elasticsearch类的main函数处打下断点,再按顺序执行第10步和第11步即可。

    image-20201120114012590.png

鸣谢:益达_兰小伟


全部评论: 0

    我有话说: