Eleaticsearch源码分析(一)编译启动

时间:2023-03-09 06:14:09
Eleaticsearch源码分析(一)编译启动

转自:https://lunatictwo.github.io/2017/12/21/Eleaticsearch%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E4%B8%80)%E7%BC%96%E8%AF%91%E5%90%AF%E5%8A%A8/

源码下载

地址:https://github.com/elastic/elasticsearch

分支

使用git tag

命令可以看到目前 es 的各个版本分支,这里我们分析 6.0 版本:

git checkout v6.0.0

编译

前提需要jdk10的支持

es使用了gradle,在es源码根目录执行:(下载依赖)

gradle idea

之后执行:(编译)

gradle build -x test

(网太慢,下了好几个小时 . md...)

注意这两步要在项目导入IDEA之前操作,源码中 build.gradle 有相关提示:

/ Make sure gradle idea was run before running anything in intellij (including import).
File ideaMarker = new File(projectDir, '.local-idea-is-configured')
tasks.idea.doLast {
ideaMarker.setText('', 'UTF-8')
}
if (System.getProperty('idea.active') != null && ideaMarker.exists() == false) {
throw new GradleException('You must run gradle idea from the root of elasticsearch before importing into IntelliJ')
}

运行

将项目导入IDEA,找到es启动主类:org.elasticsearch.bootstrap.Elasticsearch,
配置 Run/Debug Configurations:

Main Class: org.elasticsearch.bootstrap.Elasticsearch
VM Options: -Dlog4j2.disable.jmx=true -Des.path.home=/Users/Code/utils/elasticsearch-6.0. -Des.path.conf=/Users/Code/utils/elasticsearch-6.0./config

注意要配置 -Des.path.home 及 -Des.path.conf 让 es 发现主路径及配置文件路径,然后就可以愉快的启动了。

报错 1 jar hell

这个错误是因为 es 中一个 jar 文件中有大量的重复类,代码进行了审查,注释掉相关的 check 即可:

elasticsearch/core/src/main/java/org/elasticsearch/plugins/PluginsService.java line : JarHell.checkJarHell(union);
elasticsearch/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java line : JarHell.checkJarHell();

报错 2 Security.java 类中 String index out of range: -1

源码中使用了 hardcode 的方式来校验 jar 包,会造成冲突,GitHub上边有相关的 Issue:Internal: Add versionless alias for rest client codebase in policy files #26521

在 elasticsearch/core/src/main/java/org/elasticsearch/bootstrap/Security.java 中修改 esVersion 的获取方式即可:

//final String esVersion = Version.CURRENT + (Build.CURRENT.isSnapshot() ? "-SNAPSHOT" : "");
final String esVersion = Version.CURRENT.toString();