你们好,我是一野,19年非科班本科毕业,大学期间自学编程,有幸成为一名Android先后端开发者,没错我就是一名野开发,哈哈!目前和朋友成立了一家科技公司,一块儿创业作本身的一款APP产品。使用elasticsearch已经有一段时间了,做为一个Java为第一语言的developer(其实目前我也只会Java),很幸运能接触到这样优秀的产品,为何这么说呢?es的优势就不用我在此重复了,我说说个人我的想法吧。虽然目前我是在作原生Android相关开发,但我以为我必需要在一个细分领域深刻研究,显然我所说的细分领域即是指的数据检索。为何是这个领域呢,由于随着互联网的发展,特别是5G时代的到来,数据将爆炸试的增加,每个互联网产品都将面临数据检索这个问题。马云说阿里是一家数据公司,谁拥有大数据,谁将拥有将来。正如罗胖所说,数据再也不是资源,而将是土壤。它孕育着科技,也滋养着商业,而最终呢,它将是将来决定一切的力量。目前,我对大数据方面的知识知之甚少,仅仅接触过ES,也只是了解到皮毛,像Hadoop等大数据相关技术也并不了解(固然后面确定是要去学习的),目前ElasticStack做为一整套数据处理、分析、检索 技术栈,不正是我学习大数据技术最好的切入点吗?在此我由衷感谢Elastic公司能开发出这样强大好用的开源产品,下降了咱们进入大数据领域的学习成本,在我看来这就是一个机会。
受冠状病毒影响,春节在家呆了一个多月,也是这一个多月我完整的读完了田雪松老师写的《ElasticStack应用宝典》,同时也跟着阮一鸣老师在极客时间出品的“Elasticsearch核心技术与实战”系列课程完整学习了一遍,这两个都是基于ElasticStack7而出品的内容。经过他们,我算是大体了解了ES技术栈,同时对其也更加深入的理解及使用和部署、运维,至此也算是ES入门了吧。二月底,回到公司,趁闲暇时间,我决定得深刻了解ES,因而买了一本,由铭毅老师推荐的《Elasticsearch源码解析与优化实战》张超著,基于es6。可是没想到,在本书的第二章搭建源码环境时就遇到了一些小麻烦,几经周折,终于解决了,因此想分享给你们。html
好了,既然环境都准备好了,咱们就开始编译源码吧!
打开命令行进入到源码的根目录中,直接执行 ./gradlew idea 命令(早期版本可能须要执行 gradle idea),当命令行打印BUILD SUCCESSFUL 的字样就算完成了,此时你会发现源码根目录会多出一个elasticsearch-7.3.2.ipr的文件,该文件是建立idea项目时自动建立来保存项目的配置信息的文件。整个过程会花5-10分钟,甚至更久,但愿小伙伴们耐心等待了。java
此时导入以前编译为idea项目的源码进idea便可,进入工程后,等gradle加载完必要的依赖文件便可,以下图:
该工程的启动入口位于:elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java类的main函数,此时直接运行确定会报错,由于尚未配置在启动时必要的配置文件。node
点击 run——>EditConfigurations打开配置界面,新添加一个application运行的configuration,以下:git
-Des.path.home=/Users/abley/Java/elasticsearch-7.3.2/eshome -Des.path.conf=/Users/abley/Java/elasticsearch-7.3.2/eshome/config -Dlog4j2.disable.jmx=true -Djava.security.policy=/Users/abley/Java/elasticsearch-7.3.2/eshome/config/elasticsearch.policy -Des.path.plugins=/Users/abley/Java/elasticsearch-7.3.2/eshome/plugins
grant { permission javax.management.MBeanTruxtPermission "register"; permission javax.management.MBeanServerPermission "createMBeanServer"; permission java.lang.RuntimePermission "createClassLoader"; };
应该是在新版本中的问题,异常以下:es6
Exception in thread "main" java.lang.NullPointerException at org.elasticsearch.node.InternalSettingsPreparer.checkSettingsForTerminalDeprecation(InternalSettingsPreparer.java:119) at org.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:91) at org.elasticsearch.bootstrap.Bootstrap.createEnvironment(Bootstrap.java:267) at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:306) at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) at org.elasticsearch.cli.Command.main(Command.java:90) at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) Refer to the log for complete error details.
点击报错定位到源码位置以下:github
应该是output.get(settiong) 为空,因而乎断点伺候,果真如此,output是一个map集合,发现它的node.name确实为null,断点如图:编程
这彷佛很奇怪,不该该有默认值的吗,就像cluster.name。因而我好奇得跟了下源码,发现是defaultNode是在这儿定义的:
elasticsearch-7.3.2/server/src/main/java/org/elasticsearch/cli/EnvironmentAwareCommand.javabootstrap
跟进getenv(String name)方法发现是jdk内部读取环境变量有关的逻辑,看得我也是一头雾水,这目前也已经超出了个人能力范围,就此打住,有兴趣的朋友能够自行研究下,到时候记得也告诉在下学习一下,谢谢。后端
难道就没办法解决了吗?固然不是!解决方案有两种。oracle
Checks all settings values to make sure they do not have the old prompt settings. These were deprecated in 6.0.0.This check should be removed in 8.0.0. 字面翻译以下: 检查全部设置值,以确保它们没有旧的提示设置。这些在6.0.0中已弃用。此检查应在8.0.0中删除。
如今明白了吧!你只要将该方法注释掉便可。但有一个问题,它没有默认nodeName,这实际上是有问题的。因此我推荐使用第二种解决方案。
及在 elasticsearch-7.3.2/eshome/config/elasticsearch.yml文件中指定一个自定义的nodeName便可,此后es在运行时就能够加载到该nodeName而不至于报空指针异常了
本觉得大功告成能够一头扎进es源码中没法自拔时,什么鬼?还来!
再遇异常,也只能干呗,异常代码以下:
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:545) ~[main/:?] at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[main/:?] at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[main/:?] at org.elasticsearch.node.Node.<init>(Node.java:314) ~[main/:?] at org.elasticsearch.node.Node.<init>(Node.java:258) ~[main/:?] at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[main/:?] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[main/:?] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[main/:?] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[main/:?] at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[main/:?] at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[main/:?] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.2-SNAPSHOT.jar:?] at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.2-SNAPSHOT.jar:?] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[main/:?] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[main/:?] Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[?:?] at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?] Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader
我开动大脑强行分析,。。。。无果!!!因而乎,去网上找了一圈还真找到了解决方案,以下:
在源码的server模块下的 build.gradle 中82行 compileOnly project(':libs:elasticsearch-plugin-classloader') ,将compileOnly改成compile便可。这里解释下,compileOnly是指该依赖只在编译时有效,运行时无效。 既然运行时须要这个包,为啥还用compileOnly!
至此,如今终于能够愉快的运行es源码了,哈哈
前面说到我和朋友们在创业作一款APP,这款APP叫“蚂蚁同行”,初衷是曝光骗子,让社会更加诚信美好。里面有完备的IM聊天服务,真正公开透明的捐赠系统、媲美地方电视台的“焦点”模块、基于地理位置的信息检索与交互等等好玩又充满正能量的功能。这是咱们的下载地址:http://www.mytx.tech,同时也可在百度应用商店搜索到,目前正在办理软件著做权(这里顺带吐槽下,软著真是太黑了,我以为315就因该好好打打,给钱2W,两天就能够办下来,不给钱得要好几个月,我打电话给相关部门咨询软著办理事宜,相互推诿,给我个根本打不通的电话叫我咨询,得了,最终花了500,网上找了代提交的中介,说5月8号下来,在此提醒下须要办理软著的小伙伴,最好在项目进行的同时就申请,否则会很慢很慢~),等软著下来了咱们会上架到各大APPStore,感兴趣的朋友能够了解下,以为咱们作的事情有意义也欢迎广大朋友加入咱们。同时在ES的学习中你们能够相互探讨,个人我的wx:abley1874