Elasticsearch源码构建启动

准备开始深入 学习elasticsearch,对于深入一门技术,自己最喜欢的就是通过源码来学习,一方面能够从源码学习到架构知识,另外还能把es理论和实现相结合,更加深刻的理解es的构造。

不过es从我源码下载到成功启动,真的花费了很长时间,而且官网上(源码目录中CONTRIBUTING.md有部分介绍)以及网络上对应的学习资料也比较少。也可能搜索的关键字不当,直到最近才构建成功。这里也是做一个启动成功后的记录。

1.环境准备

  • 操作系统:win10
  • Elasticsearch 源码版本: 7.3.0
  • JDK版本: 11
  • Intellij Idea版本: 2019.3

现在这个版本还算比较新,不知道你们看到这篇文章的时候 jdk是否上20了,哈哈哈哈。。。

2. elasticsearch下载

  1. 使用git先把源代码拉下来
git clone  https://github.com/elastic/elasticsearch.git

2)把对应的发布代码也给下载下来
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch;至于为什么会下载后面会用能得到。

3.构建

由于es使用的gradle来构建,说实话我们可以下载gradle来构建,也可以让项目自己下载gradle,我其实就是让项目自己下载的gradle,因为我自己也用的不太熟。

先说在这里我犯了一个很大的错误,当时我从源代码拉取下来后,默认是maser的代码,那么我当时想的就是切换到对应的版本7.3,因为平时项目用的比较多的就是切换分支,这个问题也是导致我一直没启动起来的项目的重大原因。实际上es的发布版本都是基于tag来做的,这个就需要大家去了解下git的branch和tag的区别了。大家这里一定要搞对,当时我切换分支后发现有些类还没有,真是气煞人也。

继续。

1) 切换tag

git checkout  v7.3.0

2) Intellij Idea导入项目

记住新的版本通过在源码目录中执行 gradle idea 是不支持的,会抛出异常给你。

此时用Intellij idea 导入后会自动匹配gradle下载对应的版本,(具体的版本在./gradle/wrapper/gradle-wrapper.propertiesde distributionUrl中指明)

这里你会发现很多jar包下载超级慢,所以这里需要设置镜像下载,网上有说修改当前项目中的下载镜像,我是直接修改全局的gradle下载地址

在USER_HOME/.gradle/下面创建新文件 init.gradle,输入下面的内容并保存。这里的脚本把url匹配到的仓库都替换成了阿里云的仓库,

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
        }
    }
}

再次更新jar包导入,你会发现抛出了一个错误,内容大概会有下面的内容:

repository [${repository.name}] on project with path [${project.path}] is using http for artifacts on

这里也很明显不支持http,就是我们上面的镜像下载导致的。我们直接项目搜索出来抛异常的位置:
BuildPlugin.groovy脚本构建的时候有一个校验,然后我们直接给注释掉就ok了。

    private static void assertRepositoryURIUsesHttps(final ArtifactRepository repository, final Project project, final URI uri) {
        if (uri != null && uri.toURL().getProtocol().equals("http")) {
          //  throw new GradleException("repository [${repository.name}] on project with path [${project.path}] is using http for artifacts on [${uri.toURL()}]")
        }
    }

然后再次构建,就发现成功了。

4.启动

我们先找到启动类org.elasticsearch.bootstrap.Elasticsearch,你会发现启动错误一堆有一堆,不过也不用担心可以一个一个的解决。这里我就直接贴需要做的事情了,具体的原理我还未探究。详细的来自参考网络

  • 1)首先在当前目录中新建home目录,然后将我们下载的发布版本目录中config目录和module目录都复制到我们新建的home目录中
    i: 同时在config目录中新建文件java.policy并添加内容

      grant {
          permission java.lang.RuntimePermission "createClassLoader";
      };
    

    ii:在elasticsearch.yml中放开注释,不然启动没有节点名称会报空指针异常
    node.name: node-1

  • 2)配置vm-option
    这里的D:\software\ELK\es-sound-source\elasticsearch指当前项目的位置

    -Des.path.conf=D:\software\ELK\es-sound-source\elasticsearch\home\config
    -Des.path.home=D:\software\ELK\es-sound-source\elasticsearch\home
    -Dlog4j2.disable.jmx=true
    -Djava.security.policy=D:\software\ELK\es-sound-source\elasticsearch\home\config\java.policy
    

另外启动前勾选上如下图中的√


image.png
  • 3) 再次启动Elasticsearch

这次你就会发现你的服务启动了

....
[2020-06-09T17:32:43,106][INFO ][o.e.h.AbstractHttpServerTransport] [node-1] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2020-06-09T17:32:43,107][INFO ][o.e.n.Node               ] [node-1] started

本地服务访问一下http://localhost:9200/

{
  "name": "node-1",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "TBc-L_IsTryvf6xzsoBqFQ",
  "version": {
    "number": "7.3.0",
    "build_flavor": "unknown",
    "build_type": "unknown",
    "build_hash": "Unknown",
    "build_date": "Unknown",
    "build_snapshot": true,
    "lucene_version": "8.1.0",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  },
  "tagline": "You Know, for Search"
}

或者访问一下http://localhost:9200/_cat/health?v

差不多这里就结束了,大致方向就是这样,如果有疑问请留言一起探讨。
上面的不少内容参考网络上

你可能感兴趣的:(Elasticsearch源码构建启动)