一、概述
想深入理解 Elasticsearch,了解其报错机制,并有针对性的调整参数,阅读其源码是很有必要的。此外,了解优秀开源项目的代码架构,能够提高个人的代码架构能力
阅读 Elasticsearch 源码的第一步是搭建调试环境,参考 <编译调试Elasticsearch 6.3.2源码> 这篇文章完成了对 7.10.2 版本源码的调试工作
二、软件环境
- 操作系统:win11
- Elasticsearch 源码版本:7.10.2
- JDK版本:11.0.18
- Gradle版本:4gradle-6.6.1-all.zip
- IntelliJ IDEA 版本:2022.3.2
1. JDK 环境安装
Java SE Downloads 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
环境配置教程参考
2. Elasticsearch源码
- Elasticsearch github 源码托管地址:https://github.com/elastic/elasticsearch.git
elasticsearch 源码 7.10.2 版本的资源也可以从 CSDN 下载
3. Gradle 的安装包
- 查看
elasticsearch\gradle\wrapper\gradle-wrapper.properties
发现如下配置:distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
- 根据
https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
网址下载 Gradle 的安装包wget https://services.gradle.org/distributions/gradle-6.6.1-all.zip
- 注意:强烈建议使用魔法
- 放置
gradle-6.6.1-all.zip
文件:- 复制
gradle-6.6.1-all.zip
到elasticsearch\gradle\wrapper
目录下,确保和elasticsearch\gradle\wrapper\gradle-wrapper.properties
在同级目录。
- 复制
- 修改
elasticsearch\gradle\wrapper\gradle-wrapper.properties
配置distributionUrl=gradle-6.6.1-all.zip
三、源码运行配置
1. IDEA 导入源码项目
IDEA:File->Open->选中es源码路径下build.gradle->Open as Project
2. 配置JDK
在 Project Structure 中选择JDK版本
3. Import gradle project
关闭 IDEA,重新打开即可,
这个过程还是需要等一小会的
4. 添加源码运行依赖
- elasticsearch 源码运行依赖 config 和 modules ,否则启动失败。
- 下载与 elasticsearch 源码同版本windows安装包。
- 创建
home
目录,将同版本 windows 安装包的config
和modules
目录拷贝到home
目录下。
- elasticsearch 源码运行添加安全策略,否则启动失败。
config
目录下新建java.policy
文件,内容如下
grant { permission javax.management.MBeanTrustPermission "register"; permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "setContextClassLoader"; permission java.lang.RuntimePermission "getClassLoader"; };
5. 配置启动参数
-
修改运行设置添加系统参数(推荐)
- 在 IDEA 中
Run/Debug Configurations
的VM options
:添加如下 VM 启动参数
-Des.path.conf=E:\Workshop\JAVA\elasticsearch-7.10.2\home\config -Des.path.home=E:\Workshop\JAVA\elasticsearch-7.10.2\home -Djava.security.policy=E:\Workshop\JAVA\elasticsearch-7.10.2\home\config\java.policy -Dlog4j2.disable.jmx=true
- 在 IDEA 中
-
修改源码添加系统参数(偶尔会失败)
- 在 elasticsearch 源码
elasticsearch-7.10.2/server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java
文件中添加如下系统参数:
public static void main(final String[] args) throws Exception { // 参数配置 System.setProperty("es.path.conf","E:\\Workshop\\JAVA\\elasticsearch-7.10.2\\home\\config"); System.setProperty("es.path.home", "E:\\Workshop\\JAVA\\elasticsearch-7.10.2\\home"); System.setProperty("java.security.policy", "E:\\Workshop\\JAVA\\elasticsearch-7.10.2\\home"); overrideDnsCachePolicyProperties(); }
- 在 elasticsearch 源码
6. 修改运行设置
- 配置
Main class
->elasticsearch.benchmarks.main
->org.elasticsearch.bootstrap.Elasticsearch
- 从
Modify options
-> 添加Add dependencies with "Provided" scope to classpath
7. 启动 elasticsearch
运行 Elasticsearch.main()
方法,启动 elasticsearch
。
启动成功,访问 http://localhost:9200
,返回如下:
{
"name": "",
"cluster_name": "elasticsearch",
"cluster_uuid": "xrqe0WBqRACiBncjj-ANuA",
"version": {
"number": "7.10.2",
"build_flavor": "unknown",
"build_type": "unknown",
"build_hash": "unknown",
"build_date": "unknown",
"build_snapshot": true,
"lucene_version": "8.7.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
开心!
四、错误调整
1. 错误一
ERROR: the system property [es.path.conf] must be set
-
问题原因:
未配置es.path.conf
参数 -
解决方法:
参考 3.5 配置es.path.conf
参数
2. 错误二
Exception in thread "main" java.lang.IllegalStateException: path.home is not configured
-
问题原因:
未配置es.path.home
参数 -
解决方法:
参考 3.5 配置es.path.home
参数
3. 错误三
2023-04-25 22:21:11,044 main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:358)
-
问题原因:
未设置安全策略文件java.policy
或未设置log4j2.disable.jmx=true
-
解决方法:
参考 3.5 配置security.policy
参数
4. 错误四
[2023-04-25T22:27:38,439][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [] fatal error in thread [main], exiting
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
-
问题原因:
IDEA 启动选项中未添加Add dependencies with "Provided" scope to classpath
-
解决方法:
参考 3.6 修改运行设置