1、elasticsearch 6.7.0 源码环境搭建

概述

因为最近在做一个es平台的项目,需要熟悉一些es的源码,项目是基于es6.7.0的版本开发的,但是es在高的版本是基于gradle构建的,自己对gradle不熟悉,所以前面一直参考网上的在弄,但是网上和实际的还是有一点差别,所以这里特意记录一下,详细讲解了如何安装es的源码调试环境。

环境准备

win7系统
idea 201802
jdk openjdk-11.0.2
es 6.7.0
gradle-5.2.1

环境搭建步骤

1. 下载es源代码

es源码可以直接从github上面直接clone下来即可。es-github地址: https://github.com/elastic/elasticsearch

这里直接在idea中进行操作,下载完后然后切换到对应的分支,这里是使用的es6.7所以这里切换到此分支。

git checkout -b 6.7 origin/6.7

建议将其fork到自己github仓库,然后从自己的仓库clone到本地。

2. gradle环境准备

gradle的安装这里不做说明,详细的可以参考https://blog.csdn.net/Tomgs/article/details/73865508,这里说明一下如果不知道安装哪个版本的gradle,可以在es的源码目录下面的gradle/wrapper/gradle-wrapper.properties中的distributionUrl属性指定了es版本,所以这里直接根据这个版本进行下载安装即可,es6.7默认用的是gradle-5.2.1。

安装成功后进行如下配置修改工作方便后续步骤的进行。

  • 在项目中指定gradle安装包路径
    将下载的gradle-5.2.1-all.zip包放到 elasticsearch\gradle\wrapper 目录下,
    确保和 elasticsearch\gradle\wrapper\gradle-wrapper.properties 在同级目录,
    然后修改 elasticsearch\gradle\wrapper\gradle-wrapper.properties 配置如下:
distributionUrl=gradle-5.2.1-all.zip
  • 修改全局gradle仓库地址
    USER_HOME/.gradle/下面创建新文件 init.gradle(没有这个文件的可以手动创建),输入下面的内容并保存。
    修改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目录,可用自己创建

3. 编译es源码

在准备好上述环境之后,下面就可以进行相关的编译工作了,在idea的Terminal运行命令:

./gradlew idea

等待几分钟,这个过程比较慢,如果成功将会看到BUILD SUCCESSFUL的字样。

4. 打包es源码

在编译好后进行对源码进行打包操作,命令如下:

./gradlew -p distribution/archives/tar assemble --parallel

此命令将es源码打包成一个tar形式的压缩包elasticsearch-6.7.0-SNAPSHOT.jar,位于distribution/archives/tar目录下面,为什么这里还需要进行打包,因为es启动的时候需要加载module,如果使用下载的安装包里面的module的方式可能和下载的源码是不一致的导致不能启动成功,这里在后面的遇到的问题章节进行说明。

5. 开始调试es源码

将上面的安装包解压到一个具体的位置如:E:\elasticsearch-6.7.0-SNAPSHOT
找到es的启动类org.elasticsearch.bootstrap.Elasticsearch,然后运行,正常来说运行会出现错误的,这些遇到的错误在后面的遇到的问题章节进行说明,这里直接把正常的配置贴出来。
在启动的时候添加如下的jvm参数

-Xms512m 
-Xmx512m 
-Des.path.home=E:\elasticsearch-6.7.0-SNAPSHOT 
-Des.path.conf=E:\elasticsearch-6.7.0-SNAPSHOT\config 
-Dlog4j2.disable.jmx=true 
-Djava.security.policy=E:\elasticsearch-6.7.0-SNAPSHOT\config\java.policy 

上面java.policy文件的内容如下:

// default permissions granted to all domains
grant {
    permission java.lang.RuntimePermission "createClassLoader";
    // allows anyone to listen on dynamic ports
    permission java.net.SocketPermission "localhost:0", "listen";

    // "standard" properies that can be read by anyone
    permission java.util.PropertyPermission "java.version", "read";
    permission java.util.PropertyPermission "java.vendor", "read";
    permission java.util.PropertyPermission "java.vendor.url", "read";
    permission java.util.PropertyPermission "java.class.version", "read";
    permission java.util.PropertyPermission "os.name", "read";
    permission java.util.PropertyPermission "os.version", "read";
    permission java.util.PropertyPermission "os.arch", "read";
    permission java.util.PropertyPermission "file.separator", "read";
    permission java.util.PropertyPermission "path.separator", "read";
    permission java.util.PropertyPermission "line.separator", "read";
    permission java.util.PropertyPermission
                   "java.specification.version", "read";
    permission java.util.PropertyPermission "java.specification.vendor", "read";
    permission java.util.PropertyPermission "java.specification.name", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.version", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.vendor", "read";
    permission java.util.PropertyPermission
                   "java.vm.specification.name", "read";
    permission java.util.PropertyPermission "java.vm.version", "read";
    permission java.util.PropertyPermission "java.vm.vendor", "read";
    permission java.util.PropertyPermission "java.vm.name", "read";
};

然后再启动,会发现启动成功没有报错,这时访问http://localhost:9200/,出现如下结果,说明环境搭建成功了。

{
  "name" : "Yqy-_KK",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "heVTcFkoRUihY-hANO3UnA",
  "version" : {
    "number" : "6.7.0",
    "build_flavor" : "unknown",
    "build_type" : "unknown",
    "build_hash" : "Unknown",
    "build_date" : "Unknown",
    "build_snapshot" : true,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

上面为什么需要添加这些参数,可以通过报错的信息,来判断缺少什么参数,当然也可以在es的安装包中通过查看es的启动脚本elasticsearch的内容来确定需要那些参数。

exec \
   "$JAVA" \
   $ES_JAVA_OPTS \
  -Des.path.home="$ES_HOME" \
   -Des.path.conf="$ES_PATH_CONF" \
   -Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" \
   -Des.distribution.type="$ES_DISTRIBUTION_TYPE" \
   -cp "$ES_CLASSPATH" \
   org.elasticsearch.bootstrap.Elasticsearch \
   "$@"

遇到的问题

  1. 编译出现The specified initialization script 'C:\Users\***\AppData\Local\Temp\ijinit1.gradle' does not exist.

这个只需要将idea的缓存清空一下再运行编译命令,File -> Invalidate Caches/Restart

  1. 启动出现java.lang.IllegalStateException: path.home is not configured

配置jvm参数:-Des.path.home=E:\elasticsearch-6.7.0-SNAPSHOT

  1. 启动出现ERROR: the system property [es.path.conf] must be set

配置jvm参数:-Des.path.home=E:\elasticsearch-6.7.0-SNAPSHOT\config

  1. 启动出现ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")

具体堆栈如下:

2019-04-20 18:49:21,809 main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
    at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:358)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.checkMBeanTrustPermission(DefaultMBeanServerInterceptor.java:1805)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:318)
    at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at org.apache.logging.log4j.core.jmx.Server.register(Server.java:393)
    at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:168)
    at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:141)
    at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:558)
    at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:207)
    at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:220)
    at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:197)
    at org.elasticsearch.common.logging.LogConfigurator.configureStatusLogger(LogConfigurator.java:250)
    at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:166)
    at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:127)
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:302)
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
    at org.elasticsearch.cli.Command.main(Command.java:90)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)

解决办法:添加jvm参数-Dlog4j2.disable.jmx=true

  1. 启动出现java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader错误
[2019-04-20T18:51:48,279][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] fatal error in thread [main], exiting
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
    at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:545) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:339) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:266) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[main/:?]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[main/:?]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[main/:?]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[main/:?]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader
    at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[?:?]
    at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
    ... 15 more

解决办法:在idea中的Run/Debug Configuration页面勾选'Include dependencies with "Provided" scope'

Provided

  1. 启动出现java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")错误
[2019-04-22T19:29:52,650][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[main/:?]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[main/:?]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[main/:?]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[main/:?]
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[?:?]
    at java.security.AccessController.checkPermission(AccessController.java:895) ~[?:?]
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:322) ~[?:?]
    at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:384) ~[?:?]
    at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:369) ~[?:?]
    at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:359) ~[?:?]
    at java.lang.ClassLoader.<init>(ClassLoader.java:456) ~[?:?]
    at org.elasticsearch.plugins.ExtendedPluginsClassLoader.<init>(ExtendedPluginsClassLoader.java:36) ~[main/:?]
    at org.elasticsearch.plugins.ExtendedPluginsClassLoader.lambda$create$0(ExtendedPluginsClassLoader.java:57) ~[main/:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at org.elasticsearch.plugins.ExtendedPluginsClassLoader.create(ExtendedPluginsClassLoader.java:56) ~[main/:?]
    at org.elasticsearch.plugins.PluginLoaderIndirection.createLoader(PluginLoaderIndirection.java:31) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:545) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[main/:?]
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:339) ~[main/:?]
    at org.elasticsearch.node.Node.<init>(Node.java:266) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[main/:?]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[main/:?]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[main/:?]
    ... 6 more
  • 第一种:
    在jdk的home目录下面 %JAVA_HOME%\conf\security下面找到java.policy,然后打开将如下内容添加到grant里面。
    permission java.lang.RuntimePermission "createClassLoader";
  • 第二种:
    在es的config目录下面自己创建一个java.policy文件,然后添加如下内容:
grant {
   permission java.lang.RuntimePermission "createClassLoader";
}

然后启动es时指定jvm参数:

-Djava.security.policy=E:\elasticsearch-6.7.0\config\java.policy
  1. 启动出现java.lang.NoSuchFieldError: INDEX_SOFT_DELETES_RETENTION_LEASE_PERIOD_SETTING错误
[2019-04-22T19:59:54,021][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] fatal error in thread [main], exiting
java.lang.NoSuchFieldError: INDEX_SOFT_DELETES_RETENTION_LEASE_PERIOD_SETTING
    at org.elasticsearch.xpack.ccr.action.TransportResumeFollowAction.<clinit>(TransportResumeFollowAction.java:390) ~[?:?]
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?]
    at org.elasticsearch.common.inject.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:49) ~[main/:?]
    ... 6 more

这个的原因是下载的发行版的安装包和你git下来的代码不一致导致的,因为在指定es的home路径时会从种加载module模块相关的jar包,所以建议是用源码的方式编译打包然后指定到自己打包的环境,虽然说是安装的版本和源码版本是一样的但是实际结果就是不一样,尴尬
这里也是看到网上很多博客都是下载的和源码版本一样的安装包,就不自己打包了,这里自己打包和源码包对比一下就会发现还是不一样的。这个自己可以把安装包的对应的类的jar包和自己打包的jar包对比一下就知道了,这也是为什么我参考网上一些作者的资料没有运行成功的原因。

  1. 启动出现:initial heap size [201326592] not equal to maximum heap size [3202351104]; this can cause resize pauses and prevents mlockall from locking the entire heap
    错误如下:
[2019-04-23T11:16:07,203][INFO ][o.e.b.BootstrapChecks    ] [node-1] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [1] bootstrap checks failed
[1]: initial heap size [201326592] not equal to maximum heap size [3202351104]; this can cause resize pauses and prevents mlockall from locking the entire heap

这个错误的原因是因为我们启动的时候是直接用的idea命令运行的所以启动的jvm堆的参数都是使用的默认的,所以需要我们自己指定或者指定es的jvm.options文件路径(这个相对麻烦)这里就直接手动指定。
-Xms512m -Xmx512m

这些就是我在搭建es的源码编译环境所遇到的问题,这里作一下记录。

参考文章

教你编译调试Elasticsearch 6.3.2源码
渣渣菜鸡的 ElasticSearch 源码解析 —— 环境搭建

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

推荐阅读更多精彩内容