手把手教你用idea运行调试Elasticsearch源码!

5,428 阅读3分钟

为什么要做这期内容

最近买了一本《Elasticsearch源码解析与优化》,第二章即是

准备编译和调试环境

但是经过尝试后,还是以失败告终,相信看这本书的小伙伴一定也有很多遇到了这样的事情。无法运行调试源码,基本就宣告这本书提前over了。

因此搜罗网络资料,加上自己动手尝试,终于成功了,把经验分享给大家。

准备工作

  • java 1.8
  • Elasticsearch 6.1.2
  • win7
  • Intellij IDEA 2018.1.6 x64
  • gradle 4.3

导入项目

1.下载es源码

戳这里
选择zip格式的Source code下载解压即可。

2. 下载gradle

该下什么版本呢?
打开\elasticsearch-6.1.2\gradle\wrapper\gradle-wrapper.properties文件,可以看到如下内容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.3-all.zip
distributionSha256Sum=b3afcc2d5aaf4d23eeab2409d64c54046147322d05acc7fb5a63f84d8a2b8bd7

很明显,需要的是gradle4.3版本
gradle 4.3下载地址

这里,我们下载后把gradle-4.3-all.zip包放在elasticsearch\gradle\wrapper目录下,确保和elasticsearch\gradle\wrapper\gradle-wrapper.properties同级目录,然后修改elasticsearch\gradle\wrapper\gradle-wrapper.properties配置如下:

distributionUrl=gradle-4.3-all.zip

3.修改Maven仓库地址

这一步其实不是专门针对这篇文章的,主要是由于默认的国外的maven仓库下载速度太慢了!

因此这一步适用于一切需要下载maven依赖的项目

当然,如果你在国外,当我没说

需要修改下列文件的 maven URL 配置:

  • elasticsearch\benchmarks\build.gradle
  • elasticsearch\client\benchmark\build.gradle

定位到以上两个文件里面的repositories-maven-url的值,配置为阿里云maven地址: maven.aliyun.com/nexus/conte…

修改全局Maven仓库地址:在 $USER_HOME/.gradle/ 下面创建新文件init.gradle, 输入以下内容并保存:

allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all {
            ArtifactRepository repo ->
    if (repo instanceof MavenArtifactRepository) {
                def url = repo.url.toString()
                if (url.startsWith('https://repo.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                    remove repo
                }
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}

其中USER_HOME/.gradle/是自己的gradle安装目录,示例值:C:\Users\Administrator.gradle, 如果没有.gradle目录,可用自己创建,或者先执行第7步,等gradle安装后再回来修改。 上面脚本把url匹配到的仓库都替换成了阿里云的仓库, 如果有未匹配到的导致编译失败,可用自己仿照着添加匹配条件。

4.用gradle编译源码

windows运行cmd,进入DOS命令行,然后切换到elasticsearch源码的根目录,执行如下命令,把elasticsearch编译为 idea 工程:

gradlew idea

编译成功后打印日志:

BUILD SUCCESSFUL in 3m 03s

5.把工程导入idea

idea 中 File -> New Project From Existing Sources 选择你下载的 Elasticsearch 根目录,然后点 open ,之后 Import project from external model -> Gradle , 选中 Use auto-import。然后等待idea的gradle再编译一遍。

启动项目

es的启动方法是elasticsearch/server/src/main/org/elasticsearch/bootstrap/Elasticsearch.java中的 main() 方法。 但就这样启动是会报错的。 我们需要做一些配置。

1.config目录

www.elastic.co/cn/download…下载Elasticsearch的编译版本,注意一定要同版本号的,解压后将config目录拷贝到源码目录下的home目录中 然后打开Edit Configurations,在VM options总加入如下配置

-Des.path.conf=D:\elasticsearch-6.3.2\home\config

2.配置path.home

仍然是VM options, 新增

-Des.path.home=D:\elasticsearch-6.3.2\home

并且把 ES6.3.2 发行版中的 modules 文件夹复制到 home 目录下

3.开启log4j的jmx

-Dlog4j2.disable.jmx=true

4.maven依赖作用域

打开 IDEA Edit Configurations ,给 Include dependencies with Provided scope 打上勾

5.配置安全策略

home/config目录下新建java.policy文件,文件内容为

grant {
    permission java.lang.RuntimePermission "createClassLoader";
};

然后在 VM options 加入 java.security.policy 的设置,指向该文件即可

-Djava.security.policy=D:\elasticsearch-6.3.2\home\config\java.policy

此时 我们得到的终极版VM options参数如下图所示:

再点运行,可以看到控制台输出:
再打开浏览器,访问http://localhost:9200/

Done!