下载源码
-
上述网站中有各个版本的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 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”);
保存好再退出,接下来可
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
以编译了;
编译构建
- 进入文件夹elasticsearch-6.1.2,执行命令./gradlew assemble即可开始编译,下载依赖会消耗大量时间,因此请耐心等待,编译过程中CPU占用略高,如下图:
- 大约10多分钟后,编译构建成功,控制台如下所示:
…
Task :test:fixtures:old-elasticsearch:javadocJar
Building without git revision id.
Task :test:fixtures:old-elasticsearch:sourcesJar
Building without git revision id.
BUILD SUCCESSFUL in 11m 3s
473 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 <-