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用户启动
启程成功!!!