源码编译
软件环境
操作系统:win7
Elasticsearch 源码版本: 6.4.2
JDK版本: 11.0.6
Gradle版本: 4.9
Intellij Idea版本: 2019.3
环境准备及工程导入
1. 安装JDK
Elasticsearch 6.4.2需要JDK1.10编译,否则后面步骤会报错。
Java SE Downloads 地址: link
我装的是 JDK 11.0.6(10也可以)
2. 直接下载Elasticsearch 6.4.2源码
Elasticsearch 6.4.2源码:下载
3. 下载ES 6.4.2的发行版本
ES 6.4.2的发行版本:下载
4. 下载gradle的安装包
gradle-4.9:下载
5. 解压并拷贝文件
将下载的Elasticsearch 6.4.2源码(注意是源码包,不是发行版)解压,并把gradle-4.9-all.zip拷贝到elasticsearch\gradle\wrapper目录下,并修改elasticsearch\gradle\wrapper\gradle-wrapper.properties 配置如下:
distributionUrl=gradle-4.9-all.zip
在Elasticsearch 6.4.2源码目录中新建home文件夹,将下载的Elasticsearch 6.4.2发行版解压,并把config和modules两个文件夹整体拷贝到Elasticsearch 6.4.2源码目录中的home文件里
在Elasticsearch 6.4.2源码目录home/config 目录下新建 java.policy 文件,填入下面内容
grant {
permission java.lang.RuntimePermission "createClassLoader";
};
6. 修改仓库地址
国内下载国外仓库的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/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
allprojects {
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
}
7. 修改全局仓库地址
在USER_HOME/.gradle/下面创建新文件 init.gradle,输入下面的内容并保存。
注:其中USER_HOME/.gradle/是自己的gradle安装目录,示例值:C:\Users\Administrator.gradle, 如果没有.gradle目录,可用自己创建,或者先执行第8步,等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
}
}
}
8. gradle编译源码
windows运行cmd,进入DOS命令行,然后切换到elasticsearch源码的根目录,执行如下命令,把elasticsearch编译为 idea 工程:
gradlew idea
注:下载过程中如遇到无法下载jar包的话,请多重试几次,如果还不行,请登录翻墙工具进行下载
编译成功后打印日志:
BUILD SUCCESSFUL in 1m 23s
9. idea 导入elasticsearch工程
dea 中 File -> New Project From Existing Sources 选择你下载的 Elasticsearch 根目录,然后点 open ,之后 Import project from external model -> Gradle , 选中 Use auto-import, 然后就可以了。导入进去后,gradle 又会编译一遍,需要等一会
10. 运行整个项目
在 elasticsearch/server/src/main/org/elasticsearch/bootstrap 下找到Elasticsearch的启动类 Elasticsearch.java,打开文件,右键 Run Elasticsearch.main(),运行main方法
这时候100%会报错,请打开 Edit Configurations,在 VM options 加入如下配置
-Des.path.conf=D:\elasticsearch-6.4.2\home\config -Des.path.home=D:\elasticsearch-6.4.2\home -Dlog4j2.disable.jmx=true -Djava.security.policy=D:\elasticsearch-6.4.2\home\config\java.policy
并勾选Include dependencies with Provided scope
再次启动程序,如果没启动成功,会报如下错误
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
请修改server目录下的build.gradle文件中的第84行为
compile project(':libs:plugin-classloader')
这时候一般就可以启动成功了,访问http://localhost:9200/