Elasticsearch6.3源码环境搭建, 问题记录和解决完整过程

概述:

因为旧项目需要对Es做一些扩展,需要搭建一个源码环境; 在搭建的过程中遇到很多问题, 抱着死磕的精神, 终于顺利运行; 对于在搭建过程中出现的问题, 下面都有详细的记录; 解决的过程需要更改部分源码, 仅供参考, 后续有空再写一个es7版本的源码搭建流程. 


步骤梳理

1. 下载源码, 解压; 

2. 下载Gradle4.5版本, 解压, 添加init.d/init.gradle

allprojects{
     repositories {
         def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'

        maven { url REPOSITORY_URL }
 }

}

3. 下载JDK1.10, 并配置JAVA_HOME

4. 执行gradle idea命令

这个命令的执行很重要的一环, 国外源下载JAR会很慢, 需要在子模块中的build.gradle更改为国内的(如阿里云), 需要更改module有: qa, client/benchmarks, buildSrc,benchmarks

5. 导入到IDEA中, 执行Gradle的Reimport操作

有几个注意的地方, IDEA要配置gradle的目录, 源码目录下的gradle/gradle-warpper的配置也可能需要更改

6. 配置JDK的安全策略

具体查看  -->  问题10: JDK权限不足问题

7. 运行和验证

package org.elasticsearch.bootstrap;
import org.elasticsearch.test.ESTestCase;
import org.junit.Test;
public class MyEsStartTest extends ESTestCase {  
@Test public void testEsStart() throws Exception {          
        String homeDir = "D:\\dev\\elasticsearch-6.3.0\\";          
        System.setProperty("es.path.conf", homeDir + "config");         
        System.setProperty("es.path.home", homeDir);          
        Elasticsearch.main(new String[]{});    
        while(true){}
 }} 

启动成功后, 在浏览器中输入http://127.0.0.1:9200, 有信息输出则说明正常了



问题记录和处理

问题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 

exception during working with external system: java.lang.AssertionError at org.jetbrains.plugins.gradle.service.project.BaseGradleProjectResolverExtension.createModule(BaseGradleProjectResolverExtension.java:154) at org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension.createModule(AbstractProjectResolverExtension.java:86) at org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver.createModule(KotlinMPPGradleProjectResolver.kt:67) at org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension.createModule(AbstractProjectResolverExtension.java:86) at org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension.createModule(AbstractProjectResolverExtension.java:86)

解决

百度上搜索了一圈, 大部分说和IDEA的版本有关, 我的版本的2019.3 , 升级为2020.1版本

IDEA版本升级之后, 编译正常, 随便写个测试类, 能正常运行说明源码搭建完成, 可以进入下一环节了

编译完成

问题7: 测试类点击执行无反应, no tasks available

解决

更改idea的gradle编译运行方式为Intellij IDEA

问题8: 运行Es启动测试用例, 出现JarHell相关报错

报错的关键字为found jar hell in test classpath, NoClassDefFoundError

1
2

解决

从报错来看,发现了在不同的路径存在两份相同的classh或者jar导致检测不通过, 注释掉JarHell的检测代码即可, 250行处

调试思路

通过点击源码的引用和测试类, 得知BootstrapTests测试类继承自ESTestCase,会执行环境的初始化操作;
所以, 继承该类即可编写自己的测试类, JarHell的检测是在BootstrapForTesting.ensureInitialized()中的staic块完成的

问题9: VM启动配置不对, 导致启动失败

如找不到modules目录, 配置文件找不到, es.path.conf没有配置等等

ERROR: the system property [es.path.conf] must be set

java.lang.IllegalStateException: modules directory [F:\Study_Code\elasticsearch\server\es_test_temp\modules] not foundorg.elasticsearch.bootstrap.BootstrapException: java.nio.file.NoSuchFileException:

F:\Study_Code\elasticsearch\modules\reindex\plugin-descriptor.propertiesLikely root cause: java.nio.file.NoSuchFileException: F:\Study_Code\elasticsearch\modules\reindex\plugin-descriptor.properties

解决

下面代码中的conf和home是必须要配置的, 刚才找不到modules是因为源码中的文件还没经过Gradle打包处理, 所以缺失运行的文件;

这时候从官网下载一个6.3.0 tar.gz的发行版, 下载完成后解压, 代码中的路径改为解压的路径

package org.elasticsearch.bootstrap;
import org.elasticsearch.test.ESTestCase;
import org.junit.Test;
public class MyEsStartTest extends ESTestCase {

 @Test public void testEsStart() throws Exception {
         String homeDir = "D:\\dev\\elasticsearch-6.3.0\\";
         System.setProperty("es.path.conf", homeDir + "config");
         System.setProperty("es.path.home", homeDir);
         Elasticsearch.main(new String[]{});
     }
}

问题10: JDK权限不足问题

JDK10增强了安全的权限控制,导致Es的一些操作不具备权限,如 MBeanTrustPermission,MBeanTrustPermission,PropertyPermission等

java.security.AccessControlException: access denied ("java.util.PropertyPermission" "tests.security.manager" "write")

java.security.AccessControlException: access denied ("java.lang.MBeanTrustPermission" "createSecurityManager")

 Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")

.......

解决

方式1  更改JDK的安全策略配置, JDK安装目录/config/security/java.policy, 在文件末尾处添加如下信息:

permission java.util.PropertyPermission "*", "read,write";

permission java.lang.RuntimePermission "*", "read,write";

permission java.io.FilePermission "*", "read,write";

方式2 添加VM参数, 指定自定义的策略, -Djava.security.policy=policy/xx.policy

问题11:  加载x-pack报错, CreateProcess error=1816, 配额不足无法处理此命令

org.elasticsearch.bootstrap.BootstrapException: java.io.IOException:
Cannot run program "\\?\D:\dev\elasticsearch-6.3.0\modules\x-pack\x-pack-ml\platform\windows-x86_64\bin\controller.exe": CreateProcess error=1816, 配额不足,无法处理此命令。
Likely root cause: java.io.IOException: CreateProcess error=1816, 配额不足,无法处理此命令。

解决

可能是资源不足导致, 将x-pack的ml目录移除到非modules目录

问题12: 加载插件时找不到类

ElasticsearchException[Could not find plugin class []]; nested: ClassNotFoundException[];
 Likely root cause: java.lang.ClassNotFoundException:
 at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)

解决

通过debug调试发现有一个插件的className为空, 导致后面的步骤无法正常, 这时候更改PluginsService的源码, 返回空实现, 让后续步骤正常

最终, 终于解决了

因为时Junit Test方法, 所以需要让当前线程阻塞, 出现started就大功告成了, 最后在简单测试下http的接口就Ok了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352