我使用的开发环境
- idea 2019.3
- jdk1.8
- zookeeper 3.8.0
1、获取源码
zookeeper 是 apache 的开源项目,在 github 上有开源仓库https://github.com/apache/zookeeper.git,克隆到本地即可使用
这是一个标准的 maven 项目
2、IDEA 导入项目
idea 打开第一步克隆的源码
找到克隆的源码
打开之后如下图
切换分支到3.8.0
3、修改配置文件
可以看到,这里和二进制安装包一样,有 conf 和 bin
那就先复制一个配置文件,修改一下端口号
4、找到启动类,启动服务
二进制安装的时候是执行的 bin 目录下的 zkServer.sh 脚本文件,那么看一下这个文件
可以看到,启动服务其实是调用的 org.apache.zookeeper.server.quorum.QuorumPeerMain
这个类,看一下这个类
这个类里有 main 方法,调用一下
啊哦,编译报错了,那么先用maven编译一下
编译完成会生成这些找不到的类文件,再次执行 main 方法
这次说没有参数,转换不了配置文件,那么就设置一下配置文件
再次启动,又报错
这是因为pom文件里的一些依赖是 provided,只在编译时候生效,去掉即可
如果在调试的过程中遇到类找不到,也可以看一下依赖是否 provided
再次启动
这次启动成功
5、启动客户端
找到 zkCli.sh,从中找到启动类
先运行一下,报了一堆错
这里是又有依赖找不到了
在服务器二进制安装的的时候启动客户端是要指定 zookeeper 服务的ip:端口号的,这里也指定一下
这一次启动成功
但是看着和服务器上启动的客户端输出不一样
源码启动输出有如下内容
预计是依赖找不到
找到这个依赖加入进来,再次启动
这次启动是和服务器启动一样了,但是一直在输出心跳日志,这是因为没有指定日志文件,zookeeper新版本用的日志是logback,指定一下日志文件
-Dlogback.configurationFile=file:E:\workspace\test-workspace\zookeeper\conf\logback.xml
启动结果
这次启动看似很正常了,但是输入命令却没有反应,网上查是因为 jline 依赖的问题,jline 是一个控制台交互输入输出的工具,具体是什么原因,我也没搞明白,虚拟机参数加上如下参数
-Djline.terminal=jline.UnsupportedTerminal
再次启动
这一次完美启动,输入命令正常响应。
好了,zookeeper 源码环境搭建成功,可以愉快的调试和学习 zookeeper 源码了!