现在网上对于ElasticSearch(ES)方面的资料很少,而且对于ES源码方面的资料也很少,我自己看了一下ES源码,也不知道我的理解是不是正确的,就想把我自己的一些理解贴出来,一起探讨一下,希望如果发现错误跟及时给我留言,我们一起研究,共同进步。
ES我就不介绍了http://baike.baidu.com/view/8005387.htm这里有详细.
首先我们要知道几个网址:
http://www.elasticsearch.org/ 官方网址
http://s.medcl.net/ ES中文资料
https://github.com/elasticsearch/elasticsearch 源码下载地址
我的开发环境是 Eclipse+Maven ,首先我们先把源码下载下来,再执行"mvn package -DskipTests
",成功了?反正我是失败了,编译出错
[ERROR] ...\elasticsearch-src\elasticsearch\src\main\java \org\elasticsearch\search\internal\InternalSearchHits.java:[23,0] 找不到符号 [ERROR] 符号: 静态 readSearchHit
查看了一下源码23行是静态导入,这是编译环境问题先用Eclipse编译,再继续,搞定。
通过上面的步骤源码就可以被跑起来了,打开 bin\elasticsearch.bat
"%JAVA_HOME%\bin\java" %JAVA_OPTS% %ES_JAVA_OPTS% %ES_PARAMS% %* -cp "%ES_CLASSPATH%" "org.elasticsearch.bootstrap.ElasticSearch"
可以明显看出启动类为:
org.elasticsearch.bootstrap.ElasticSearch
而ElasticSearch.java类很简单
public class ElasticSearch extends Bootstrap { public static void close(String[] args) { Bootstrap.close(args); } public static void main(String[] args) { Bootstrap.main(args); } }
直接调用的是Bootstrap.main方法,也就是说我们直接运行Bootstrap类,跟运行ElasticSearch是一样的。我以Bootstrap类启动为例,运行后大家会发现控制台没有输出,我开始以为是log4j配置问题, 找到org.elasticsearch.common.logging.log4j.LogConfigurator 发现配置应该不可能有问题,最后在Bootstrap类找到了原因
boolean foreground = System.getProperty("es.foreground", System.getProperty("es-foreground")) != null; // handle the wrapper system property, if its a service, don't run as a service if (System.getProperty("wrapper.service", "XXX").equalsIgnoreCase("true")) { foreground = false; } ... if (!foreground) { Loggers.disableConsoleLogging(); System.out.close(); }
foreground为false 把控制台关闭了,把foreground设置为true即可,源码环境就搭建完了。