Elasticsearch源码调试环境配置
本文介绍一下Elasticsearch在本地IDE中的调试配置,方便源码阅读和开发。
重要的选择
在开始搭建环境之前,需要作出两个重要的决定:
- Elasticsearch什么版本
- Java要什么版本
比较好的组合是:Elasticsearch 6.x及以下配Java 8,Elasticsearch 7.x配Java 9。
这是因为Elasticsearch 6.x使用了一些在Java 9中被废弃的包,这时候如果用Java 9来编译的话需要一些额外配置(后面会提到一点点)。而Elasticsearch 7.x是强制需要Java 9来编译的。
虽然可以做一些workaround让build跑起来,但是后面还会遇到一些很难受的坑(test过不去之类的),所以强烈建议使用Java 8编译Elasticsearch 6.x。
源码准备
1. 安装gradle
1 |
brew install gradle |
2. 安装Java 9,到Java官网下载安装
PS: 在master分支上(当前是v7.0.0 alpha)要强制Java9,这里就先装了~
3. 下载代码,切换到一个比较新的Tag,当前最新的是v6.1.3
1 2 |
git clone https://github.com/elastic/elasticsearch.git git checkout v6.1.3 |
4. 下载依赖和生成IDEA所需要的项目配置
1 |
gradle idea |
5. 设置JAVA_HOME
Elasticsearch项目的编译和运行都需要环境变量显示定义环境变量JAVA_HOME,具体原因见这里,如果不知道在哪的话可以运行 /usr/libexec/java_home 来看下。
6. 编译
1 |
gradle build -x test -x integTest |
(-x test -x integTest可以跳过漫长的单元测试和继承测试)
如果使用的是Java 9,会提示JAXB Class缺失,因为这个东西在Java 9中被废弃了,如果需要使用,可以手动添加,在gradle.properties中添加:
1 2 3 4 5 |
dependencies { compile 'javax.xml.bind:jaxb-api:2.3.0' compile 'com.sun.xml.bind:jaxb-core:2.3.0' compile 'com.sun.xml.bind:jaxb-impl:2.3.0' } |
导入IDEA
1. 导入,直接open project即可
2. 在Run >> Edit Configuration中添加JVM选项:
1 |
-Des.path.conf=./distribution/src/main/resources/config -Des.path.home=./distribution/src/main/resources/bin -Dlog4j2.disable.jmx=true |
目的是设置config目录和bin目录(用于加载插件),并关闭jmx
3. 设置log和data目录,编辑distribution >> src >> main >> resources >> config >> elasticsearch.yml
将 ${path.data} 和 ${path.logs}替换为创建好的目录,比如我的是:
1 2 3 4 5 |
#${path.data} path.data : /Users/yiz96/Data/elasticsearch/data #${path.logs} path.logs : /Users/yiz96/Data/elasticsearch/logs |
4. 运行core >> src >> main >> java >> org >> elasticsearch >> bootstrap >> elasticsearch.java中的main方法。
这时候elasticsearch会尝试启动,并在distribution里的bin目录下创建bin、lib、modules和plugins目录,但是启动会失败。
5. 将distribution >> build >> modules目录复制到distribution >> src >> main >> resources >> bin目录下。
6. 再次运行main方法,已经可以成功执行
7. 试一下, curl localhost:9200 ,返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "name" : "WFEoYVM", "cluster_name" : "elasticsearch", "cluster_uuid" : "_qbX5VyZRO6uCBjGX7a0dw", "version" : { "number" : "6.1.3", "build_hash" : "Unknown", "build_date" : "Unknown", "build_snapshot" : true, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } |
You know, for search
其他
如果不跳过integTest,会卡在一个test case上,相关issue到目前还是open的状态(链接在此),不过跳过似乎对于本地调试没有什么影响。
博主你好,我这边也是尝试本地启动ES,但是编译成功之后无法启动,报错空指针异常,无法激活string.hashcode(),然后也没有bin目录以及build目录,请问一下这个问题是啥原因呢