准备环境
本次我选择的环境是 7.X
中目前最新的 7.17
版本,代码下载下来之后,需要关注的文件有以下三个:
CONTRIBUTING.md
中的 Contributing to the Elasticsearch codebase
部分详细说明了需要的 JDK
版本,而后面的两个 Ggradle
文件中则声明了对应分支所使用的 Gradle
版本,以及一些额外的要求(其它版本的要求类似,都可以在这些文档中找到),以下为从上述文件中获取到的 7.17
的环境要求信息:
JDK 17
;GRADLE_USER_HOME
,环境变量,用于指定依赖的下载位置;gradle-7.4.1
,在 gradle-wrapper.properties中有详细描述,最好的方式是使用./gradlew
或者gradlew.bat
,它们会自动下载 wrapper文件中对应版本的gradle
,并存放到GRADLE_USER_HOME
中;
导入项目到 IDEA 中
此部分在 Contributing.md
中也有详细的描述,并说明了要求的最低 idea
的版本为 2020.1
(很贴心,每个版本的分支中都有),下面为 7.17 版本的操作步骤:
- 选择 File > Open
- 在子窗口中,选择源代码根目录所在的
build.gradle
文件 - 在子窗口中选择 Open as Project
- 选择 File > Project Structure,设置项目的
SDK
为JDK17
张超老师的源码书中,6.3左右的版本中需要先执行
./gradlew idea
再进行导入,目前使用该命令时会提示已经过时
启动项目
等待 Gradle
下载完依赖包之后,我们就可以开始启动项目了,具体的程序入口在 server
目录下的 org.elasticsearch.bootstrap.Elasticsearch#main
方法里。这里我们需要针对启动做一些额外配置:
首先在 idea
的 run > Edit Configuration 中新建一个 Application
,设置名称为 local
以及对应的 SDK
设置模块名为 elasticsearch.server.main
(不先设置的话 Main class
会找不到指定类),设置Main class
为 org.elasticsearch.bootstrap.Elasticsearch
,同时找到 Modify options
,将 add vm options
选中(我用的 idea2021.3
版本默认是隐藏了的)
vm options 一栏的具体内容如下所示:
1 | -Des.path.home=I:\eshome |
在解释这些信息前,我们需要创建一个 eshome
目录(名称随意,可以在你电脑磁盘任意位置),ES
在启动时需要从中加载配置、模块,并向该目录写入相关日志信息。然后我们还需要向其中拷贝一些必要的模块和配置文件。获取这些文件的方式有以下两种:
- 选择官方发布包对应版本,解压后将
config
、modules
、plugins
目录复制到eshome
目录中,注意修改 elasticsearch.yml 中的配置 - 参考
README
中的说明自行编译,然后拷贝到eshome
目录中,运行./gradlew localDistro
之后即可根据自己当前的操作系统编译出对应的包,例如我是 windows系统,可以在distribution/archives/windows-zip
中找到编译完成的文件。注意修改 elasticsearch.yml 中的配置
现在我们来细看下 vm options
中各参数的含义:
参数 | 说明 |
---|---|
-Des.path.home | 指定 eshome 所在的路径名 |
-Des.path.conf | 指定配置文件的位置,ES 启动时会使用该目录下的配置文件 |
-Djava.security.policy | 指定自定义 policy 文件的位置 |
-Dlog4j2.disable.jmx | 不加此参数倒也能启动,不过控制台中会多出一些 access denied 的错误 |
-Xms、-Xmx | 最小堆内存、最大堆内存设置 |
除上述信息外,我们还需要在 config
目录下手动创建一个名为 elasticsearch.policy 的文件,其内容如下:
1 | grant { |
不同版本下会存在一些区别,启动时如果缺少 permission
(例如将上述的最后一行删掉)会报类似如下的错误,将其添加到 policy
文件中即可,本质原因是由于 ES
自定义了代码安全策略,并在自己的 security.policy
文件中进行管理。而我们在调试时 idea
是使用的自行编译的 class
文件,详情可参考这篇文章 elasticsearch之自定义Java代码的安全策略管理。
配置好自定义的 policy
文件之后,我们还需要在 server
模块的 resouces
目录下找到源码中携带的 security.policy
文件,注释掉该文件的 codebase.elasticsearch-secure-sm
,codebase.elasticsearch
,codebase.elasticsearch-plugin-classloader
三处的权限配置,否则在启动时你会看到如下报错信息。(这里的原因是,此部分配置是针对打包后的设置,而我们在调试运行时,只有 classes
文件,所以会识别不到,详情也可参考社区里的提问idea运行es报Unknown codebases异常)
到这里,我们的环境就配置完成了,点击启动,就能看到调试运行单机版的 ES
了
另外,节点在启动时默认会去官网同步 geoip
数据,如果 elasticsearch.yml
文件中没有设置 ingest.geoip.downloader.enabled: false
的话,会显示 access denied (org.elasticsearch.secure_sm.ThreadPermission "modifyArbitraryThreadGroup")
,如果不希望看到报错信息的话,加上该配置即可解决。下图为我使用的配置文件内容:
参考文章
- 《Elasticsearch源码解析与优化实战 》
- elasticsearch之自定义Java代码的安全策略管理
- idea运行es报Unknown codebases异常
- 官方仓库,Contributing、Readme 等文档内容