ElasticSearch是一个很不错的搜索引擎,值得我们去学习学习,不仅要学习其怎么使用,还需要去学习去源码,为了更好的学习源码,就需要本地运行其源码,本文的目的就是记录一下本地编译构建运行es源码。
准备工作
1. 源码下载,先去github上下载源码,我在搭建的时候是直接使用的master分支,此时的稳定版本是8.17.3。
2. 设置环境变量 GRADLE_USER_HOME ,指定一个路径即可,最好是一个干净的目录,如果是Linux系统,可以不用设置,默认指向的是 ~/.gradle 目录,即家目录下的 .gradle 目录(后面会说明其用意,如果你可以连接外网,这一步可以完全忽略)
3. 将代码导入集成开发工具,注意是使用 gradle 构建,gradle 可以不用下载安装都可以。如果在国内,导入后首次构建必然是失败的。
开始构建
1. 为了使构建速度稍微快一点,先将maven源设置为国内的镜像,比如阿里云,修改setting.gradle文件
pluginManagement {
repositories {
maven { url = 'https://maven.aliyun.com/repository/public' } // 使用等号
maven { url = uri('https://maven.aliyun.com/repository/google') } // 或使用 uri()
maven { url = 'https://maven.aliyun.com/repository/gradle-plugin' }
gradlePluginPortal()
mavenCentral()
}
includeBuild "build-conventions"
includeBuild "build-tools"
includeBuild "build-tools-internal"
}
#此配置需要配置在 plugins 后面
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
repositories {
maven { url = 'https://maven.aliyun.com/repository/public' } // 使用等号
maven { url = uri('https://maven.aliyun.com/repository/google') } // 或使用 uri()
maven { url = 'https://maven.aliyun.com/repository/gradle-plugin' }
mavenCentral()
}
}
即使这么配置了,项目根目录下运行
./gradlew build
还是会报如下错,
注意:随着版本的迭代,下面错误提示中出现的内容可能会有所不同。
* What went wrong:
Unable to download toolchain matching the requirements ({languageVersion=21, vendor=Eclipse Temurin, implementation=vendor-specific})
from 'https://api.adoptium.net/v3/binary/version/jdk-21.0.6+7/windows/x64/jdk/hotspot/normal/eclip
se?project=jdk', due to: Could not HEAD 'https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6+7/OpenJDK21U-jdk_x64_windows_hotspot_21.0.6_7.zip'.
2. 报错的原因就是国内访问不了外网,下载不了指定的jdk版本,如果你可以访问外网,可能不会遇到这样的问题,如何解决,找国内的镜像地址,比如清华镜像,然后直接去下载对应的版本。下载完成后,还记得准备工作中 GRADLE_USER_HOME 环境变量对应的目录吗?此时进入到这么目录下,会有一个jdks的目录,然后将下载的jdk压缩包直接丢进去,上面的问题就能解决了。
注意:如果jdk压缩包丢进去还是提示下载失败,检查文件目录下是否存 CACHEDIR 文件,如果存在则直接删除即可。
3. 编译到后面的时候还会存在docker相关的问题,如果你安装了docker,应该不会出现问题,如果没有安装,在如果直接使用 ./gradlew build 构建应该会报错,需要在编译的时候跳过docker相关的任务:
./gradlew build -x :distribution:docker:buildAarch64WolfiDockerImage -x :distribution:docker:buildAarch64CloudEssDockerImage -x :distribution:docker:buildAarch64DockerImage -x :distribution:docker:buildWolfiDockerImage -x :distribution:docker:buildCloudEssDockerImage -x :distribution:docker:buildDockerImage -x :distribution:docker:buildAarch64IronBankDockerImage -x :distribution:docker:buildIronBankDockerImage