教你編譯調試Elasticsearch 6.3.2源碼

      網友投稿 928 2025-04-01

      微信原文:教你編譯調試elasticsearch 6.3.2源碼

      前言

      想深入理解 elasticsearch,閱讀它的源碼是很有必要的,一來可以了解它內部的具體實現,有助于調優,二來可以了解優秀開源項目的代碼架構,提高我們的代碼架構能力等

      操作系統:win7

      Elasticsearch 源碼版本: 6.3.2

      JDK版本: 10.0.2

      Gradle版本: 4.7

      Intellij Idea版本: 2018.2

      環境準備及工程導入

      Elasticsearch 6.3.3需要JDK1.9編譯,否則后面步驟會報錯。

      Java SE Downloads 地址:

      http://www.oracle.com/technetwork/java/javase/downloads/index.html

      Elasticsearch github源碼托管地址:

      https://github.com/elastic/elasticsearch.git

      git?checkout?v6.3.2

      也可直接下載源碼包,地址在 https://github.com/elastic/elasticsearch/releases

      查看 elasticsearch\gradle\wrapper\gradle-wrapper.properties 發現如下配置:

      distributionUrl=https://services.gradle.org/distributions/gradle-4.5-all.zip

      Elasticsearch 6.3.2需要安裝gradle-4.5,官方-:

      https://services.gradle.org/distributions/gradle-4.5-all.zip

      注意:由于國內網速問題,為了加快速度,進行第4步操作

      將下載的gradle-4.5-all.zip包放到 elasticsearch\gradle\wrapper 目錄下,

      確保和 elasticsearch\gradle\wrapper\gradle-wrapper.properties 在同級目錄,

      然后修改 elasticsearch\gradle\wrapper\gradle-wrapper.properties 配置如下:

      distributionUrl=gradle-4.5-all.zip

      國內下載國外倉庫的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/'

      }

      }

      dependencies?{

      classpath?'com.github.jengelman.gradle.plugins:shadow:2.0.2'

      }

      }

      在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

      編譯失敗則按照錯誤信息解決問題,可用使用如下命令幫助定位問題:

      gradlew?idea?-info

      gradlew?idea?-debug

      一般是Maven倉庫地址不可用導致jar包無法下載,從而編譯失敗,此時請參考步驟5和6修改相關的倉庫地址。

      編譯成功后打印日志:

      BUILD?SUCCESSFUL?in?1m?23s

      idea 中 File -> New Project From Existing Sources 選擇你下載的 Elasticsearch 根目錄,然后點 open ,之后 Import project from external model -> Gradle , 選中 Use auto-import, 然后就可以了

      導入進去后,gradle 又會編譯一遍,需要等一會,好了之后如下:

      運行,開始 solve error 模式

      在 elasticsearch/server/src/main/org/elasticsearch/bootstrap 下找到Elasticsearch的啟動類 Elasticsearch.java,打開文件,右鍵 Run Elasticsearch.main(),運行main方法

      1、 報錯如下:

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

      這是需要配置 es.path.conf 參數,我們先在 elasticsearch 源碼目錄下新建一個 home 目錄,然后在 https://www.elastic.co/downloads/elasticsearch 下載一個同版本號的 Elasticsearch6.3.2 發行版,解壓,將 config 目錄拷貝到 home 目錄中

      然后打開 Edit Configurations,在 VM options 加入如下配置:

      -Des.path.conf=D:\elasticsearch-6.3.2\home\config

      再次運行 Run Elasticsearch.main()

      2、報錯如下:

      Exception?in?thread?"main"?java.lang.IllegalStateException:?path.home?is?not?configured

      at?org.elasticsearch.env.Environment.(Environment.java:103)

      ...

      需要配置 path.home 這個參數,在 VM options 中添加如下配置:

      -Des.path.home=D:\elasticsearch-6.3.2

      再次RUN

      3、報錯如下:

      教你編譯調試Elasticsearch 6.3.2源碼

      2018-08-22?15:07:17,094?main?ERROR?Could?not?register?mbeans?java.security.AccessControlException:?access?denied?("javax.management.MBeanTrustPermission"?"register")

      ...

      Caused?by:?java.nio.file.NoSuchFileException:?D:\elasticsearch-6.3.2\modules\aggs-matrix-stats\plugin-descriptor.properties

      ...

      在 VM options 中把 path.home 的值修改為如下:

      -Des.path.home=D:\elasticsearch-6.3.2\home

      然后把 ES6.3.2 發行版中的 modules 文件夾復制到 home 目錄下,然后再次RUN

      4、報錯如下:

      2018-08-22?15:12:29,876?main?ERROR?Could?not?register?mbeans?java.security.AccessControlException:?access?denied?("javax.management.MBeanTrustPermission"?"register")

      ...

      在 VM options 中加入

      -Dlog4j2.disable.jmx=true

      1、2、3、4 的配置最終如下:

      再次RUN

      5、報錯如下:

      [2018-08-23T00:53:17,003][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler]?[]?fatal?error?in?thread?[main],?exiting

      java.lang.NoClassDefFoundError:?org/elasticsearch/plugins/ExtendedPluginsClassLoader

      at?org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:632)?~[main/:?]

      at?org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:557)?~[main/:?]

      at?org.elasticsearch.plugins.PluginsService.(PluginsService.java:162)?~[main/:?]

      at?org.elasticsearch.node.Node.(Node.java:311)?~[main/:?]

      at?org.elasticsearch.node.Node.(Node.java:252)?~[main/:?]

      at?org.elasticsearch.bootstrap.Bootstrap$5.(Bootstrap.java:213)?~[main/:?]

      at?org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213)?~[main/:?]

      at?org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326)?~[main/:?]

      at?org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136)?~[main/:?]

      at?org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)?~[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:93)?~[main/:?]

      at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)?~[main/:?]

      Caused?by:?java.lang.ClassNotFoundException:?org.elasticsearch.plugins.ExtendedPluginsClassLoader

      at?jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)?~[?:?]

      at?jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)?~[?:?]

      at?java.lang.ClassLoader.loadClass(ClassLoader.java:499)?~[?:?]

      ...?15?more

      解決方法: 打開 IDEA Edit Configurations ,給 Include dependencies with Provided scope 打上勾即可解決,很簡單吧!!

      繼續RUN,又來一個 Exception

      6、報錯如下:

      [2018-08-23T01:13:38,551][WARN?][o.e.b.ElasticsearchUncaughtExceptionHandler]?[]?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:140)?~[main/:?]

      at?org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)?~[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:93)?~[main/:?]

      at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)?~[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:335)?~[?:?]

      at?java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:397)?~[?:?]

      ...

      Exception:?java.security.AccessControlException?thrown?from?the?UncaughtExceptionHandler?in?thread?"Thread-2"

      這個問題也找了挺久,最終才發現解決方法(兩種):

      第一種: 在 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

      第二種: 就是在 %JAVA_HOME%/conf/security 目錄下(JDK10是這個路徑,之前的版本不確定),我的目錄是 C:\Program Files\Java\jdk-10.0.2\conf\security,打開 java.policy 文件,在 grant 中加入下面這句,賦予權限

      permission?java.lang.RuntimePermission?"createClassLoader";

      效果如下:

      再RUN,這次可終于運行起來了!!!

      來看一下效果,瀏覽器訪問 http://localhost:9200/

      瀏覽器訪問 http://localhost:9200/_cat/health?v

      一切正常,終于可以愉快的 DEBUG 源碼啦!!!

      另一種源碼調試方式:遠程調試

      如果上面第五個報錯之后解決不了無法繼續進行,可以選擇這種方式:

      在 Elasticsearch 源碼目錄下打開 CMD,輸入下面的命令啟動一個 debug 實例

      gradlew?run?--debug-jvm

      如果啟動失敗可能需要先執行 gradlew clean 再 gradlew run --debug-jvm 或者 先退出 IDEA

      在 IDEA 中打開 Edit Configurations,添加 remote

      配置 host 和 port

      點擊 debug,瀏覽器訪問 http://localhost:9200/,即可看到ES返回的信息

      隨機調試一下, 打開 elasticsearch/server/src/main/org/elasticsearch/rest/action/cat 下的 RestHealthAction 類,在第 54 行出設置一個斷點,然后瀏覽器訪問 http://localhost:9200/_cat/health,可以看到斷點已經捕獲到該請求了

      運行成功,可以開始設置斷點進行其他調試

      其他可能遇到的問題

      1. 錯誤信息如下

      JAVA8_HOME?required?to?run?tasks?gradle

      配置環境變量 JAVA8_HOME,值為 JDK8 的安裝目錄

      2. 錯誤信息如下

      [2018-08-22T13:07:23,197][INFO?][o.e.t.TransportService???]?[EFQliuV]?publish_address?{10.100.99.118:9300},?bound_addresses?{[::]:9300}

      [2018-08-22T13:07:23,211][INFO?][o.e.b.BootstrapChecks????]?[EFQliuV]?bound?or?publishing?to?a?non-loopback?address,?enforcing?bootstrap?checks

      ERROR:?[1]?bootstrap?checks?failed

      [1]:?initial?heap?size?[268435456]?not?equal?to?maximum?heap?size?[4273995776];?this?can?cause?resize?pauses?and?prevents?mlockall?from?locking?the?entire?heap

      [2018-08-22T13:07:23,219][INFO?][o.e.n.Node???????????????]?[EFQliuV]?stopping?...

      2018-08-22?13:07:23,269?Thread-2?ERROR?No?log4j2?configuration?file?found.?Using?default?configuration:?logging?only?errors?to?the?console.?Set?system?property?'log4j2.debug'?to?show?Log4j2?internal?initialization?logging.

      Disconnected?from?the?target?VM,?address:?'127.0.0.1:5272',?transport:?'socket'

      在 Edit Configurations 的 VM options 加入下面配置

      -Xms2g

      -Xmx2g

      參考文檔:

      Eclipse導入Elasticsearch源碼

      Elasticsearch源碼分析—環境準備(一)

      渣渣菜雞的 ElasticSearch 源碼解析 —— 環境搭建

      教你如何在 IDEA 遠程 Debug ElasticSearch

      后記

      歡迎評論、轉發、分享,您的支持是我最大的動力

      更多內容可訪問我的個人博客:http://laijianfeng.org

      關注【小旋鋒】微信公眾號,及時接收博文推送

      Maven Elasticsearch

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:【云駐共創】輕松學習華為云數據庫之SQL語言
      下一篇:認識Excel COUNTIF函數
      相關文章
      亚洲avav天堂av在线网爱情| 亚洲网址在线观看你懂的| 亚洲综合在线成人一区| 国产亚洲高清不卡在线观看| 亚洲综合区小说区激情区| 亚洲av手机在线观看| 亚洲色大成网站www永久男同| 亚洲AV无码一区二区三区在线| 久久亚洲AV成人出白浆无码国产| 亚洲av中文无码乱人伦在线播放 | 中文字幕亚洲激情| 亚洲区不卡顿区在线观看| 亚洲一级特黄大片无码毛片 | 亚洲2022国产成人精品无码区 | 亚洲精品又粗又大又爽A片| 亚洲人成自拍网站在线观看| 亚洲欧美日韩综合久久久久 | 亚洲色偷偷综合亚洲av78| 亚洲色偷精品一区二区三区 | 久久亚洲免费视频| 亚洲综合精品一二三区在线| 亚洲成熟xxxxx电影| 亚洲黄网站wwwwww| 亚洲伦理一二三四| 亚洲综合久久精品无码色欲| 中文字幕在线观看亚洲日韩| 亚洲午夜无码久久久久软件| 自拍偷自拍亚洲精品播放| 欧美激情综合亚洲一二区| 亚洲国产精品激情在线观看| 久久久久亚洲爆乳少妇无 | 一本色道久久88—综合亚洲精品 | 人人狠狠综合久久亚洲| 亚洲男人天堂2020| 久久亚洲高清观看| 久久久亚洲欧洲日产国码是AV | 亚洲精品少妇30p| 1区1区3区4区产品亚洲| 亚洲kkk4444在线观看| 欧美色欧美亚洲另类二区| 综合亚洲伊人午夜网|