原文链接:ElasticSearch-7.8.0 源码编译调试 (详细) - 知乎
Rejjie
一、准备工作 1. 编译工具-Gradle
(本文使用: gradle-6.5-all.zip
)
1) 官网下载链接:https://services.gradle.org/distributions/
2) 有时候官网龟速,这里提供云盘
(链接:https://pan.baidu.com/s/1dVOPpxDh3JWjazrYsT8N9g 提取码:62w2)
2. ElasticSearch
- 客户端
1) 官网下载链接:https://www.elastic.co/downloads/elasticsearch
2) 官网龟速,推荐华为云镜像:https://mirrors.huaweicloud.com/elasticsearch/
3. ElasticSearch
- 源码包
1) github下载地址:https://github.com/elastic/elasticsearch/archive/v7.8.0.zip
4. Jdk-14
环境 Jdk-9
环境(供groovy
使用)
1) jdk-14 -华为云镜像下载地址:https://mirrors.huaweicloud.com/openjdk/14/
2) jdk-9 官网下载地址:http://jdk.java.net/java-se-ri/9
5. Groovy - 3.0.5
, 用于编译 ElasticSearch
源码包中的一些模块交互逻辑;
1) 官网下载地址:https://dl.bintray.com/groovy/maven/apache-groovy-sdk-3.0.5.zip
二、设置环境变量
1. Gradle环境变量
---- For Windows (操作路径)
1) 设置环境变量
右击此电脑 ——> 属性 ——> 高级系统设置 ——> 高级 ——> 环境变量
——> 'xxx'的用户变量 ——> 新建 ——> 变量名:GRADLE_HOME——>变量值:你的GRALDE安装目录完整路径 ——> 点 "确定"
2) 加入到系统环境变量 "PATH" 中
'xxx'的用户变量 ——> 选中 "PATH" 变量 ——> 点 "编辑" ——> 点 "新建" ——> 输入 "%GRADLE_HOME%\bin" ——> 点 "确定"
---- For Mac
打开 Teminal 终端,输入如下命令
echo "export GRADLE_HOME='你的GRADLE安装目录完整路径'\nexport PATH=\$GRADLE_HOME/bin:\$PATH\n" >> ~/.bash_profile
source ~/.bash_profile
2. Jdk-14 环境变量
变量名为 JAVA_HOME, 安装目录为上述你所下载的 Jdk-14 安装目录,设置思路同上。
3. Jdk-9 环境变量
为避免冲突,此环境变量名为 `JAVA9_HOME`,安装目录为上述下载的 `jdk-9` 安装目录,设置思路同上。
==注:此环境变量不需加入PATH
中,在设置 Groovy
启动文件时再指定即可。==
1)变量名为 GROOVY_HOME, 安装目录为上述你所下载的Groovy安装目录,设置思路同上。
2)修改 GROOVY_HOME 中 bin 目录下的的启动脚本(Windows 为 startGroovy.bat,Linux 为 startGroovy)
将脚本中的 JAVA_HOME 改为上述我们配置的 JAVA9_HOME
三、提速工作
1. Gradle 换源
编译ElasticSearch
需要下载很多依赖包,而其中有很多包的站源是国外的,下载时比较慢。 因此需要给Gradle换成国内镜像源(本文使用阿里云镜像),提升依赖包下载速度。 在 GRADLE_HOME 目录中的 init.d
路径下,创建文件 init.gradle
,并贴上如下内容:
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://plugins.gradle.org/m2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
remove repo
}
}
}
maven { url ALIYUN_REPOSITORY_URL }
maven { url ALIYUN_GRADLE_PLUGIN_URL }
}
}
2. ElasticSearch 源码包换 Gradle 分发地址
打开你下载下来的 ElasticSearch
源码包,进入目录 gradle/wrapper
。然后,重新将 GRADLE_HOME
打包成 gradle-6.5-all.zip,拷贝到该目录下。
随后,打开文件 gradle-wrapper.properties
,如下:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
distributionUrl=gradle-6.5-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionSha256Sum=c9910513d0eed63cd8f5c7fec4cb4a05731144770104a0871234a4edc3ba3cef
上述文件原计划的 distributionUrl
默认为官网下载地址。 意思是在编译源码初期,程序会去搜寻指定好的 gradle-6.5-all.zip
压缩文件,然后解压下载。 但官网有时下载特别慢,会导致编译第一步就卡壳了。 本文初已提供了 gradle-6.5-all.zip
的快速下载方式,便于使用。 所以这里并不需要再次进行下载,
因此在文件中指定 distributionUrl = gradle-6.5-all.zip
,就在本地文件目录即可。 这样可以快速跳过编译前期漫长的下载 gradle-6.5-all.zip
的等待时间。
点击“Open as Project” 打开项目;
2. 打开后,根据如下图中操作,进入配置界面。点“Import Gradle Project”
3. 如下图中进行配置,配置完成后,点 "OK" 。ElasticSearch
源码
1. 本地启动源码
1) 创建一个 Java-Application
启动配置
VM options 如下:
-Des.path.home=E:\WorkSpace\JavaStudio\EStuido\Elastic-stack-7.8.0\client\elasticsearch-7.8.0-client-for-windows
-Des.path.conf=E:\WorkSpace\JavaStudio\EStuido\Elastic-stack-7.8.0\client\elasticsearch-7.8.0-client-for-windows\config
-Dlog4j2.disable.jmx=true
-Xmx4g
-Xms4g
其中, -Des.path.home -- 指定上文中你所下载的 ElasticSearch 客户端安装路径; -Des.path.conf -- 指定客户端安装路径中的配置路径;
3) 点 “Apply”,点 “OK”;等等!!等等!!等等!! 在运行源码之前,还有一些小细节需要注意。
来,打开你所配置的 JAVA_HOME/conf/security/java.policy 文件, 在文件中的 grant 结构末尾加上以下权限指令:
permission java.lang.RuntimePermission "createClassLoader";
小细节2:记得在配置文件中设置 node.name, 不然会启动失败,报空指针错误;
ElasticSearch-7.8.0
在加载配置文件时,如果没有设置 node.name
,程序会去获取系统中的HOSTNAME
环境变量作为默认值,若系统中没有配置环境变量HOSTNAME
,则获取到的值为空,导致在验参阶段时会跳出空指针错误。
因此,为避免该错误,可以对 -Des.path.conf
路径中的配置文件elasticsearch.yml
,进行如下设置,以指定节点名:
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: es-source-demo
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: es-source-node
到这里,我宣布,ElasticSearch-7.8.0
源码启动前的所有工作准备完毕。
来吧,展示。
点击右上角的绿色小三角,Run !
到这里,已经可以成功地以源码形式去运行 ElasticSearch 了。
下面再介绍一种远程源码调试方式。
2. 远程调试源码 1) 创建一个Remote
远程启动配置
如上图配置
2) 调整ElasticSearch
远程客户端 jvm.options
配置
在远程的 ElasticSearch 客户端 config 目录下的 jvm.options 文件加入 Jvm 的配置参数,如下:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
然后在远程机器上把 ElasticSearch
客户端 Run 起来。启动命令如下:
./elasticsearch -d
3) 在 IntelliJ Idea
上,使用上述配置好的 Remote
启动配置,把源码跑起来。
ElasticSearch 作为一个优秀的开源搜索引擎框架,已经得到互联网各大厂们的充分认可。无论是作为搜索引擎、日志系统等领域,都称得上是一个成熟的解决方案。
本文是在一个“实操者”的视角下完成的,所以你们会看到上文有很多细节,甚至对一些专业从业者来说有点“笨”的操作细节。本着“在实战过程中去思考”的学习理念,这些细节值得我们一步一步去推敲,直至了解一个“软件工程”的实战构建全貌。
笔者作为一个爱学习的技术菜鸟,希望能拥有一个“一边打断点,一边调试”环境,站在源码的角度,好好去窥探一下大牛们的代码思维,系统架构设计思路。通过调试源码的方式,一步步地去总结自身对分布式系统学习的一些知识。所以有了这篇文章,欢迎广大技术爱好者进行交流分享!
这是进行 ElasticSearch
源码分析的第一步,路漫漫,加油!