elasticsearch6.4.2修改編譯源碼 root用戶啓動

elasticsearch6.4.2修改編譯源碼 root用戶啓動

前言

在安裝elasticsearch時遇到一個瓶頸問題:國產化操作系統無法使用普通用戶安裝啓動軟件以及打開命令行,es2以上的版本無法使用root用戶啓動,如果要降版本代價比較大,因此修改elasticsearch源碼

軟件環境

  • Elasticsearch 源碼版本:6.4.2
  • JDK版本:12.0.1(es6.4.2需要jdk10及以上)
  • Gradle版本:4.9(下載es源碼後在./gradle/wrapper/gradle-wrapper.properties文件中可看到當前版本es需要的gradle版本)

環境配置

jdk、es源碼、gradle下載完成後:
1、安裝jdk,配置java home
2、解壓Elasticsearch源碼壓縮包,將解壓後的es源碼文件夾命名爲:elasticsearch
3、將elasticsearch\gradle\wrapper\gradle-wrapper.properties中的distributionUrl=https://services.gradle.org/distributions/gradle-4.9-all.zip
   更改爲distributionUrl=gradle-4.9-all.zip,並將下載的gradle-4.9-all.zip放到 elasticsearch\gradle\wrapper 目錄下。
4、修改源碼Maven倉庫地址(2處位置):
   elasticsearch\benchmarks\build.gradle
   elasticsearch\client\benchmark\build.gradle
   ※ 兩個build.gradle文件中可能會沒有maven倉庫配置項,需要新添加
   buildscript {
      repositories {
          maven {
              url 'http://maven.aliyun.com/nexus/content/groups/public/'
          }
      }
      dependencies {
          classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
      }
  }
5、修改全局gradle的maven倉庫地址:在USER_HOME/.gradle/下面創建新文件 init.gradle,輸入下面的內容並保存。USER_HOME=C:\Users\Windows本機的用戶名\.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
          }
      }
   }
5、gradle編譯源碼
   進入elasticsearch源碼的根目錄運行cmd把elasticsearch編譯爲 idea 工程:gradlew idea
   編譯成功後會出現BUILD SUCCESSFUL相關信息

運行es的main方法錯誤問題

  • 錯誤1;ERROR: the system property [es.path.conf] must be set
    缺少es.path.conf配置,在工程根目錄創建home目錄,然後在 https://www.elastic.co/downloads/elasticsearch 下載一個同版本號的 Elasticsearch6.4.2 安裝包,解壓,將 config、modules 目錄拷貝到 home 目錄中
    然後打開 Edit Configurations,在 VM options 加入如下配置:
    -Des.path.conf=D:\workspace\idea_workspace\elasticsearch\home\config
    
  • 錯誤2:Exception in thread “main” java.lang.IllegalStateException: path.home is not configured
    在 VM options 中添加:
    -Des.path.home=D:\workspace\idea_workspace\elasticsearch
    
  • 錯誤3:ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
    在 VM options 中把 path.home 的值修改爲:
    -Des.path.home=D:\workspace\idea_workspace\elasticsearch\home
    
  • 錯誤4:ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
    在 VM options 中加入:
    -Dlog4j2.disable.jmx=true
    
  • 錯誤5:[ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [] fatal error in thread [main], exiting
    java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
    打開 IDEA Edit Configurations ,給 Include dependencies with Provided scope 打上勾保存即可。
    

修改運行打包源碼

上述已經將es源碼編譯成了 idea 工程,現在使用 idea 導入elasticsearch源碼

idea 中 File -> New Project From Existing Sources 選擇 Elasticsearch 根目錄,然後點 open ,之後 Import project from external model -> Gradle , 選中 Use auto-import, 至此導入完成。導入後gradle會再次編譯一遍。
先運行main:在 server/src/main/org/elasticsearch/bootstrap 下找到Elasticsearch的啓動類 Elasticsearch.java,打開文件,右鍵 Run Elasticsearch.main(),運行main方法。
打開 Edit Configurations,在 VM options 加入配置:

-Des.path.conf=D:\workspace\idea_workspace\elasticsearch\home\config
-Des.path.home=D:\workspace\idea_workspace\elasticsearch
-Des.path.home=D:\workspace\idea_workspace\elasticsearch\home
-Dlog4j2.disable.jmx=true

修改源碼:可以使用使用root用戶啓動:

在 idea 中打開server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java
找到 if (Natives.definitelyRunningAsRoot()) 代碼,可以看到在if語句塊內部拋出了異常,從代碼定義的字面意思來看,當判斷啓動用戶爲root時拋出異常,這就意味着使用root無法啓動。
可以將 throw new RuntimeException 置換爲 logger.warn,將異常改爲警告日誌即可。
再次運行main方法

打包

點擊打開 idea 右側的 Gradle 下的es項目,打開具體的 elasticsearch-6.4.2 -> Tasks -> build,雙擊 jar,將項目打爲jar包。
文件系統打開elasticsearch\server\build\distributions 看到elasticsearch-6.4.2-SNAPSHOT.jar,將其命名爲elasticsearch-6.4.2.jar
將官網下載的es安裝包中lib目錄下的elasticsearch-6.4.2.jar更換爲自己編譯的jar即可。上傳服務器解壓配置root用戶啓動
啓程成功!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章