写点什么

Elasticsearch6.1.2 源码下载和编译构建

作者:程序员欣宸
  • 2022 年 9 月 08 日
    广东
  • 本文字数:2624 字

    阅读完需:约 9 分钟

Elasticsearch6.1.2源码下载和编译构建

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 为了深入学习 elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程;

环境信息

  1. 操作系统:Ubuntu 18.04.2 LTS

  2. JDK:1.8.0_191

  3. Gradle:4.6

  4. elasticsearch:6.1.2


  • 请确保 JDK 和 Gradle 已安装在 Ubuntu 电脑上,并且环境变量设置成功;

账号问题

  • 由于 elasticsearch 要求以非 root 身份启动,因此本次实战用的不是 root 账号,以下命令可用来创建 admin 账号:


groupadd admin && useradd -d /home/admin -g admin -m admin
复制代码

下载源码

  • 源码下载地址是:https://github.com/elastic/elasticsearch/releases

  • 上述网站中有各个版本的 release,找到我们需要 的 6.1.2 版本,然后下载压缩包,如下图:

  • 将源码下载到 Ubuntu 电脑上,执行 tar -zxf elasticsearch-6.1.2.tar.gz 解压后,得到新的文件夹 elasticsearch-6.1.2;

修改源码

  • 为了证明修改的源码可以正常构建和运行,我们来修改一个 java 文件,在里面打印一些日志;

  • 进入前面解压得到的文件夹 elasticsearch-6.1.2

  • 打开文件 core/src/main/java/org/elasticsearch/node/Node.java ,增加一个静态方法,作用是打印当前线程堆栈情况,内容如下:


public static void printTrack(Logger logger, String prefix){        StackTraceElement[] st = Thread.currentThread().getStackTrace();        if(null==st){            logger.info("invalid stack");            return;        }        StringBuffer sbf =new StringBuffer();        for(StackTraceElement e:st){            if(sbf.length()>0){                sbf.append(" <- ");                sbf.append(System.getProperty("line.separator"));            }            sbf.append(java.text.MessageFormat.format("{0}.{1}() {2}"                ,e.getClassName()                ,e.getMethodName()                ,e.getLineNumber()));        }        logger.info(prefix            + "\n************************************************************\n"            + sbf.toString()            + "\n************************************************************");    }
复制代码


  • 找到 Node.java 的如下方法:


protected Node(final Environment environment, Collection<Class<? extends Plugin>> classpathPlugins) {        final List<Closeable> resourcesToClose = new ArrayList<>(); // register everything we need to release in the case of an error        boolean success = false;        {            // use temp logger just to say we are starting. we can't use it later on because the node name might not be set            Logger logger = Loggers.getLogger(Node.class, NODE_NAME_SETTING.get(environment.settings()));            logger.info("initializing ...");        }
复制代码


  • logger.info("initializing ..."); 这一行代码下面增加下面这一行内容,作用是在 elasticsearch 启动时打印 Node 类实例的调用堆栈:


printTrack(logger, "Here is stack of Node instance");
复制代码


  • 保存好再退出,接下来可以编译了;

编译构建

  • 进入文件夹 elasticsearch-6.1.2 ,执行命令**./gradlew assemble**即可开始编译,下载依赖会消耗大量时间,因此请耐心等待,编译过程中 CPU 占用略高,如下图:



  • 大约 10 多分钟后,编译构建成功,控制台如下所示:


...> Task :test:fixtures:old-elasticsearch:javadocJarBuilding without git revision id.
> Task :test:fixtures:old-elasticsearch:sourcesJarBuilding without git revision id.

BUILD SUCCESSFUL in 11m 3s473 actionable tasks: 473 executed
复制代码


  • 编译完成后,进入目录 elasticsearch-6.1.2/distribution/tar/build/distributions 可以见到构建成功的结果:elasticsearch-6.1.2-SNAPSHOT.tar.gz,这就是可用的 elasticsearch-6.1.2;

  • 构建结果文件以 SNAPSHOT 作为文件名后缀,如果不想要此后缀,在编译的时候改用以下命令即可:


./gradlew assemble -Dbuild.snapshot=false
复制代码

验证构建的 elasticsearch 是否可用

  • 解压 elasticsearch-6.1.2-SNAPSHOT.tar.gz 到一个目录下;

  • 进入目录 elasticsearch-6.1.2-SNAPSHOT/config ,修改 network.host 的配置为 0.0.0.0,如下图:



  • 进入目录 elasticsearch-6.1.2-SNAPSHOT/bin ,执行 ./elasticsearch 命令启动服务;

  • 在控制台可以看到新增的代码打出的日志,将 Node 类的调用堆栈打印出来了,我们也借此机会了解到 elasticsearch 启动时的涉及到的关键类:


[2019-04-20T04:02:55,785][INFO ][o.e.n.Node               ] [] initializing ...[2019-04-20T04:02:55,789][INFO ][o.e.n.Node               ] [] Here is stack of Node instance************************************************************java.lang.Thread.getStackTrace() 1,559 <-org.elasticsearch.node.Node.printTrack() 953 <-org.elasticsearch.node.Node.<init>() 255 <-org.elasticsearch.node.Node.<init>() 245 <-org.elasticsearch.bootstrap.Bootstrap$5.<init>() 212 <-org.elasticsearch.bootstrap.Bootstrap.setup() 212 <-org.elasticsearch.bootstrap.Bootstrap.init() 322 <-org.elasticsearch.bootstrap.Elasticsearch.init() 121 <-org.elasticsearch.bootstrap.Elasticsearch.execute() 112 <-org.elasticsearch.cli.EnvironmentAwareCommand.execute() 86 <-org.elasticsearch.cli.Command.mainWithoutErrorHandling() 124 <-org.elasticsearch.cli.Command.main() 90 <-org.elasticsearch.bootstrap.Elasticsearch.main() 92 <-org.elasticsearch.bootstrap.Elasticsearch.main() 85************************************************************
复制代码


  • 我的 ubutnu 电脑的 IP 地址是 192.168.50.75,因此用浏览器访问此地址:http://192.168.50.75:9200 ,返回内容如下所示:



  • 至此编译构建 elasticsearch6.1.2 成功,在您编译构建 elasticsearch 的时候,希望本文能给您提供参考;

建议

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022 年 09 月 08 日阅读数: 69
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Elasticsearch6.1.2源码下载和编译构建_elasticsearch_程序员欣宸_InfoQ写作社区