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:jdk需要10及以上版本,這裏用了當前最新版jdk-12.0.1
- 下載Elasticsearch源碼:這裏使用Elasticsearch6.4.2進行編譯
- 下載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用戶啓動
啓程成功!!!