最近买了一本《Elasticsearch源码解析与优化》,第二章即是
准备编译和调试环境
但是经过尝试后,还是以失败告终,相信看这本书的小伙伴一定也有很多遇到了这样的事情。无法运行调试源码,基本就宣告这本书提前over了。
因此搜罗网络资料,加上自己动手尝试,终于成功了,把经验分享给大家。
戳这里 选择zip格式的Source code下载解压即可。
该下什么版本呢?
打开/elasticsearch-6.1.2/gradle/wrapper/gradle-wrapper.properties文件,可以看到如下内容:
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https/://services.gradle.org/distributions/gradle-4.3-all.zip distributionSha256Sum=b3afcc2d5aaf4d23eeab2409d64c54046147322d05acc7fb5a63f84d8a2b8bd7 复制代码
很明显,需要的是gradle4.3版本
gradle 4.3下载地址这里,我们下载后把gradle-4.3-all.zip包放在 elasticsearch/gradle/wrapper 目录下,确保和 elasticsearch/gradle/wrapper/gradle-wrapper.properties 同级目录,然后修改 elasticsearch/gradle/wrapper/gradle-wrapper.properties 配置如下:
distributionUrl=gradle-4.3-all.zip 复制代码
这一步其实不是专门针对这篇文章的,主要是由于默认的国外的maven仓库下载速度太慢了!
因此这一步适用于一切需要下载maven依赖的项目
当然,如果你在国外,当我没说
需要修改下列文件的 maven URL 配置:
定位到以上两个文件里面的 repositories-maven-url 的值,配置为阿里云maven地址: maven.aliyun.com/nexus/conte…
修改全局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 } } } 复制代码
其中USER_HOME/.gradle/是自己的gradle安装目录,示例值:C:/Users/Administrator.gradle, 如果没有.gradle目录,可用自己创建,或者先执行第7步,等gradle安装后再回来修改。 上面脚本把url匹配到的仓库都替换成了阿里云的仓库, 如果有未匹配到的导致编译失败,可用自己仿照着添加匹配条件。
windows运行cmd,进入DOS命令行,然后切换到elasticsearch源码的根目录,执行如下命令,把elasticsearch编译为 idea 工程:
gradlew idea 复制代码
编译成功后打印日志:
BUILD SUCCESSFUL in 3m 03s 复制代码
idea 中 File -> New Project From Existing Sources 选择你下载的 Elasticsearch 根目录,然后点 open ,之后 Import project from external model -> Gradle , 选中 Use auto-import。然后等待idea的gradle再编译一遍。
es的启动方法是 elasticsearch/server/src/main/org/elasticsearch/bootstrap/Elasticsearch.java 中的 main() 方法。 但就这样启动是会报错的。 我们需要做一些配置。
去 www.elastic.co/cn/download… 下载Elasticsearch的编译版本,注意一定要同版本号的,解压后将 config 目录拷贝到源码目录下的 home 目录中 然后打开Edit Configurations,在VM options总加入如下配置
-Des.path.conf=D:/elasticsearch-6.3.2/home/config 复制代码
仍然是VM options, 新增
-Des.path.home=D:/elasticsearch-6.3.2/home 复制代码
并且把 ES6.3.2 发行版中的 modules 文件夹复制到 home 目录下
-Dlog4j2.disable.jmx=true 复制代码
打开 IDEA Edit Configurations ,给 Include dependencies with Provided scope 打上勾
在 home/config 目录下新建 java.policy 文件,文件内容为
grant { permission java.lang.RuntimePermission "createClassLoader"; }; 复制代码
然后在 VM options 加入 java.security.policy 的设置,指向该文件即可
-Djava.security.policy=D:/elasticsearch-6.3.2/home/config/java.policy 复制代码
此时 我们得到的终极版VM options参数如下图所示:
再点运行,可以看到控制台输出:
再打开浏览器,访问http://localhost:9200/
Done!