概述:
步骤梳理
1. 下载源码, 解压;
2. 下载Gradle4.5版本, 解压, 添加init.d/init.gradle
3. 下载JDK1.10, 并配置JAVA_HOME
4. 执行gradle idea命令
5. 导入到IDEA中, 执行Gradle的Reimport操作
6. 配置JDK的安全策略
7. 运行和验证
问题记录和处理
问题1: gradle->reimport的时候会出现该错误
解决
在导入源码之前先要执行gradle idea; gradle的版本必须和上面的版本保持一致,否则会报错找不到类, 如果不配置gradle的环境变量,则先进到es的源码根目录,然后再gradle全路径执行
问题2: gradle idea执行过程报错, 没有操作权限
解决
https://my.oschina.net/u/946606/blog/152608
修改注册表, 设置权限
问题3: 编译benchmarks模块出错
解决
图1 网络太慢导致一些文件无法下载下来, 下载过程非常缓慢, 改为阿里云的仓库;
图2 JDK版本升级为10, 图中说gradle的警告可忽略
问题4: 配置了hadoop的环境变量, 报错
解决:
方法1: 把HADOOP_HOME从系统的环境变量中删除
方法2: 注释掉源代码, 让后面的编译工作先正常运作
问题5 下载太漫长,出错
gradle配了全局的源, 没有生效, 因为es的子模块配置中央仓库
解决
将仓库改为阿里云, 搜索build.gradle发现很多文件, 其实模块内的几个就可以, 大概是是qa, client/benchmarks, buildSrc,benchmarks
找到build.gradle中的仓库配置部分代码, 如果没有则添加
问题6 依赖下载完后, 编译依旧失败,Gradle出现AssertionError
解决
百度上搜索了一圈, 大部分说和IDEA的版本有关, 我的版本的2019.3 , 升级为2020.1版本
IDEA版本升级之后, 编译正常, 随便写个测试类, 能正常运行说明源码搭建完成, 可以进入下一环节了
问题7: 测试类点击执行无反应, no tasks available
解决
更改idea的gradle编译运行方式为Intellij IDEA
问题8: 运行Es启动测试用例, 出现JarHell相关报错
报错的关键字为found jar hell in test classpath, NoClassDefFoundError
解决
从报错来看,发现了在不同的路径存在两份相同的classh或者jar导致检测不通过, 注释掉JarHell的检测代码即可, 250行处
调试思路
问题9: VM启动配置不对, 导致启动失败
如找不到modules目录, 配置文件找不到, es.path.conf没有配置等等
解决
下面代码中的conf和home是必须要配置的, 刚才找不到modules是因为源码中的文件还没经过Gradle打包处理, 所以缺失运行的文件;
这时候从官网下载一个6.3.0 tar.gz的发行版, 下载完成后解压, 代码中的路径改为解压的路径
问题10: JDK权限不足问题
JDK10增强了安全的权限控制,导致Es的一些操作不具备权限,如 MBeanTrustPermission,MBeanTrustPermission,PropertyPermission等
解决
方式1 更改JDK的安全策略配置, JDK安装目录/config/security/java.policy, 在文件末尾处添加如下信息:
方式2 添加VM参数, 指定自定义的策略, -Djava.security.policy=policy/xx.policy
问题11: 加载x-pack报错, CreateProcess error=1816, 配额不足无法处理此命令
解决
可能是资源不足导致, 将x-pack的ml目录移除到非modules目录
问题12: 加载插件时找不到类
解决
通过debug调试发现有一个插件的className为空, 导致后面的步骤无法正常, 这时候更改PluginsService的源码, 返回空实现, 让后续步骤正常
最终, 终于解决了
因为时Junit Test方法, 所以需要让当前线程阻塞, 出现started就大功告成了, 最后在简单测试下http的接口就Ok了