Elasticsearch 5.6.8源代码编译

前言

之前一直在维护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


Elasticsearch 5.6.8源代码编译_第1张图片
image.png

在shell中运行

gradle run --debug-jvm

运行debug,访问http://localhost:9200

Elasticsearch 5.6.8源代码编译_第2张图片
image.png

此时已经成功运行ES,我们在org.elasticsearch.rest.action.cat打个断点,运行 http://localhost:9200/_cat/health测试一下
image.png

到此我们可以调试ES源代码啦,接下来可以好好的研究~

源代码打包

在根目录下执行:gradle clean,gradle build

你可能感兴趣的:(Elasticsearch 5.6.8源代码编译)