为了方便学习elasticsearch(elasticsearch github传送门),很有必要在对代码进行编译,并在本地进行运行或调试。
本文记录了如何在本地通过idea打开es工程并编译源码,并且在idea中进行调试。
本地环境:
macOS:10.15.5
idea:2021.3.1(建议选用最新版本,之前碰到过由于idea版本过低导致无法正常导入的情况)
java:jdk15
es分支:7.10.2
以下步骤均针对于7.10.2版本,其它版本大同小异。
编译 1、下载es源码到本地
2、切换至需要使用的分支或者tag
切换到对应分支
git checkout branch_name
切换到对应tag
git checkout -b branch_name tag_name
为了切换到7.10.2所使用的tag
git checkout -b v7.10.2 v7.10.2
3、修改gradle仓库(切换到国内仓库)
添加文件到此路径下/Users/xxx/.gradle
文件名:init.gradle
allprojects{ repositories { def REPOSITORY_URL = 'https://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { remove repo } } } maven { url REPOSITORY_URL } }}
4、在代码根目录下执行
gradlew jar
正常情况下会最后输出:BUILD SUCCESSFUL
5、直接使用idea打开该工程
一般情况下即可正常导入。
若不能正常导入,检查idea中gradle的配置。主要关注一下3个地方的配置
1、对elasticsearch进行打包,根据本地不同的系统,命令也不一致。
在macos下建议使用
gradlew distribution:archives:oss-no-jdk-darwin-tar:assemble
其它系统使用的打包可使用如下命令进行构建
gradlew distribution:archives:xxx:assemble
其中xxx用如下工程名进行替换
构建好的产物在代码根目录下
/distribution/archives/oss-no-jdk-darwin-tar/build/distributions
解压此工程,以便于后续使用。
2、打开org.elasticsearch.bootstrap.Elasticsearch,右键直接运行。
此时会出现异常,提示
ERROR: the system property [es.path.conf] must be set
添加vm option
-Des.path.home=/Users/XXX/Desktop/study/ElasticSearch/elasticsearch/distribution/archives/oss-no-jdk-darwin-tar/build/distributions/elasticsearch-7.10.2-SNAPSHOT-Des.path.conf=/Users/XXX/Desktop/study/ElasticSearch/elasticsearch/distribution/archives/oss-no-jdk-darwin-tar/build/distributions/elasticsearch-7.10.2-SNAPSHOT/config-Dlog4j2.disable.jmx=true-Djava.security.policy=/Users/XXX/Desktop/study/ElasticSearch/elasticsearch/distribution/archives/oss-no-jdk-darwin-tar/build/distributions/elasticsearch-7.10.2-SNAPSHOT/config/elasticsearch.policy
其中 elasticsearch.policy中的内容如下
grant{ permission javax.management.MBeanTrustPermission "register"; permission javax.management.MBeanServerPermission "createMBeanServer"; permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "setContextClassLoader";};
大致配置选项如下图所示
若出现如下异常信息:
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
需要修改server模块 build.gradle中84行
把compileonly project(':libs:elasticsearch-plugin-classloader')修改为compile project(':libs:elasticsearch-plugin-classloader')
成功启动后,即可正常使用es。