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: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相关信息

elasticsearch工程导入IDEA

```
idea 中 File -> New Project From Existing Sources 选择 Elasticsearch 工程根目录,然后点 open ,
之后 Import project from external model -> Gradle , 选中 Use auto-import。
至此,elasticsearch 工程源码导入idea,下面开始编译打包。
```

运行es的main方法错误问题

elasticsearch-x.y.z/server/src/main/java:org.elasticsearch.bootstrap.Elasticsearch
  • 错误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:[WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.security.AccessControlException: access denied (“java.lang.RuntimePermission” “createClassLoader”)
在 home/config 目录下新建 java.policy 文件,填入下面内容:
grant {
  permission java.lang.RuntimePermission "createClassLoader";
};
然后在 VM options 加入 java.security.policy 的设置,指向该文件即可
-Djava.security.policy=D:\workspace\idea_workspace\elasticsearch\home\config\java.policy
  • 错误6:[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用户启动
启程成功!!!

参考文章

你可能感兴趣的:(Java,架构,Elasticsearch)