前言
之前一直在维护ES集群,但是对于底层原理没有了解那么多,所以需要研究下源代码,一来可以深入理解ES实现细节,二来可以学习优秀的开源框架代码
软件环境
MacOS 10.13.4
Elasticsearch 5.6.8
Maven 3.5.2
Gradle 4.5
JDK 1.8
注:gradle版本很重要低于4.3无法编译
环境准备
1.安装JDK
Elasticsearch 5.6.8需要至少JDK1.8编译
JDK下载页面
https://www.oracle.com/technetwork/java/javase/downloads/index.html
2.下载Elasticsearch源码,切换到5.6.8分支
Elasticsearch github源码托管地址:
https://github.com/elastic/elasticsearch.git
git checkout v5.6.8
也可直接下载源码包,地址在 https://github.com/elastic/elasticsearch/releases
3.安装gradle
这里使用Homebrew安装最新版很简单
brew install gradle
比如这里安装了最新的4.9,但是编译ES需要4.5所以要用Homebrew再安装一个版本
3.1 查看软件的信息
使用命令 brew info gradle
输出内容如下:
gradle: stable 4.9
Build system based on the Groovy language
https://www.gradle.org/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/gradle.rb
==> Requirements
Required: java >= 1.7 ✔
==> Options
--with-all
Installs Javadoc, examples, and source in addition to the binaries
可以看到,我这里是已经安装了 gradle 4.9 版本,第一行显示了 brew 使用的 bottled 里的 gradle 为 4.9 版本,在第 4 行中有路径。而现在需要安装的版本为 4.1
3.2 修改安装源信息
我们将刚才输出内容第5行的页面https://github.com/Homebrew/homebrew-core/blob/master/Formula/gradle.rb
页面打开复制gradle.rb到本地,然后编辑文件
class Gradle < Formula
desc "Open-source build automation tool based on the Groovy and Kotlin DSL"
homepage "https://www.gradle.org/"
url "https://services.gradle.org/distributions/gradle-5.4.1-all.zip"
sha256 "14cd15fc8cc8705bd69dcfa3c8fefb27eb7027f5de4b47a8b279218f76895a91"
bottle :unneeded
depends_on :java => "1.8+"
def install
rm_f Dir["bin/*.bat"]
libexec.install %w[bin docs lib media samples src]
(bin/"gradle").write_env_script libexec/"bin/gradle", Language::Java.overridable_java_home_env
end
test do
assert_match version.to_s, shell_output("#{bin}/gradle --version")
end
end
我们修改第4行 url 和第5行 sha256,将这两个关键信息修改,即可安装指定版本。可以从 https://gradle.org/releases/ 网站查询到 gradle v4.5 的相关信息,修改成如上内容并保存
3.3 安装修改过的源
然后我们执行命令brew install ~/Downloads/gradle.rb
,这里指定的 ruby 文件是我们修改后的文件路径,如果安装提示如下错误:
Error: gradle 4.9 is already installed
To install 4.1, first run `brew unlink gradle
只需安装提示执行 brew unlink gradle
,然后再次执行安装命令 brew install ~/Downloads/gradle.rb
即可。
安装成功后执行命令 gradle -v 查看当前生效的版本
3.4 软件版本切换
执行命令 brew info gradle
可以查看已安装的信息
/usr/local/Cellar/gradle/4.5 (11,101 files, 173.3MB) *
/usr/local/Cellar/gradle/4.9 (207 files, 92.9MB)
我们当前使用的是4.9,切换到4.5
brew switch gradle 4.5
最后执行gradle -v
查看当前生效版本信息
4.修改源代码Maven仓库地址
国内下载国外仓库的jar包速度慢,需要替换Maven地址,设置为本地或者国内可用的Maven仓库。
需要修改下列文件的 maven URL 配置:
elasticsearch\benchmarks\build.gradle
elasticsearch\client\benchmark\build.gradle
修改源码中上面build.gradle文件里面的repositories-maven-url的值,
配置为可用的仓库地址,譬如修改为阿里云maven地址 http://maven.aliyun.com/nexus/content/groups/public/,修改示例如下:
buildscript {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
5.修改全局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
}
}
}
但是我的gradle并不是源代码安装的,所以我不知道USER_HOME在哪,后来查了一下USER_HOME就是安装的位置,之前我们使用brew info gradle
输出:
/usr/local/Cellar/gradle/4.5 (11,101 files, 173.3MB) *
/usr/local/Cellar/gradle/4.9 (207 files, 92.9MB)
实际上USER_HOME就是在下面这个位置,对应别的版本类似
/usr/local/Cellar/gradle/4.5/libexec
在/usr/local/Cellar/gradle/4.5/libexec
下新建文件夹.gradle
然后新建文件init.gradle
6.gradle编译源码
接下来就可以编译源码,进入根目录执行如下命令,把ES编译为idea工程
gradle idea
编译失败则按照错误信息解决问题,可用使用如下命令帮助定位问题:
gradle idea -info
gradle idea -debug
一般是Maven仓库地址不可用导致jar包无法下载,从而编译失败,此时请参考步骤5和6修改相关的仓库地址。
编译成功后打印日志:
BUILD SUCCESSFUL in 34m 28s
运行Elasticsearch
由于直接运行ES会出现很多错,这里我们使用debug模式来运行ES
在Run->Edit Configurations中设置Remote,端口为8000
![](https://img.haomeiwen.com/i5601396/2b3364ae78c950ba.png)
在shell中运行
gradle run --debug-jvm
运行debug,访问http://localhost:9200
![](https://img.haomeiwen.com/i5601396/4b7e254603518ea3.png)
此时已经成功运行ES,我们在org.elasticsearch.rest.action.cat打个断点,运行
http://localhost:9200/_cat/health
测试一下![](https://img.haomeiwen.com/i5601396/1f2f9ea6e78b9aa7.png)
到此我们可以调试ES源代码啦,接下来可以好好的研究~
源代码打包
在根目录下执行:gradle clean
,gradle build
网友评论