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.0 -Des.path.conf=/Users/Code/utils/elasticsearch-6.0.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 379: JarHell.checkJarHell(union); elasticsearch/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java line 195: 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();