星云于飞

环境准备

下载zookeeper源码

源码下载通道

配置Ant

zookeeper默认是基于ant来构建

ant的下载地址

下载好之后,在环境变量里面配置几个东西

1
2
3
ANT_HOMT=${ant_home}  //ant_home为自己本地安装的目录
PATH=%ANT_HOME%/bin
CLASSPATH=%ANT_HOME%/lib

配置好之后,就可以在命令窗口中执行ant -version. 会得到下面这段信息,说明安装成功

1
Apache Ant(TM) version 1.10.7 compiled on September 1 2019

基于Ant构建zookeeper源码

编译

进入到zookeeper解压的根目录下,执行

1
ant eclipse

显示如下结果,表示编译成功

导入到IDEA中

选择import project

接着,选择eclipse,然后一直下一步就行

启动zookeeper

首先来看如下几个类的作用

  • org.apache.zookeeper.server.quorum.QuorumPeerMain :集群启动类

  • org.apache.zookeeper.server.ZooKeeperServerMain :单机启动类

  • org.apache.zookeeper.ZooKeeperMain:命令客户端启动类

  • org.apache.zookeeper.version.util.VerGen:Info.Java生成类

源码调试,不需要搭建集群,所以直接基于单机环境来启动即可

配置run configuration

按照下面这个位置进行配置

添加application

zoo.cfg默认是不存在的,但是在源码根目录有一个conf目录,里面提供了zoo_sample.cfg。 我们只需要复制一份改一个名字即可

配置好之后,直接启动即可

配置日志输出

默认情况下,控制台没有把日志打印出来,应该是没有找到log4j.properties。

配置如下jvm启动参数,指定log4j.properties路径即可

1
-Dlog4j.configuration=file:/DataDisk/Workspace/StudyProject/zookeeper-release-3.5.6/conf/log4j.properties

启动之后,会输出如下日志,表示启动成功, 默认使用2181的端口号

1
2
3
4
2019-11-22 13:06:46,959 [myid:] - INFO  [main:JettyAdminServer@112] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
2019-11-22 13:06:46,968 [myid:] - INFO [main:ServerCnxnFactory@135] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2019-11-22 13:06:46,972 [myid:] - INFO [main:NIOServerCnxnFactory@673] - Configuring NIO connection handler with 10s sessionless connection timeout, 2 selector thread(s), 24 worker threads, and 64 kB direct buffers.
2019-11-22 13:06:46,974 [myid:] - INFO [main:NIOServerCnxnFactory@686] - binding to port 0.0.0.0/0.0.0.0:2181

连接测试

直接启动org.apache.zookeeper.ZooKeeperMain类即可

源码构建中遇到的问题

Info类不存在

遇到的问org.apache.zookeeper.version.Info找不到符号

org.apache.zookeeper.version.util包里有个VerGen.java文件,运行这个文件来生成Info.Java,

VerGen类添加启动参数

我理解这个是用来在Zookeeper每次发布版本的时候用来固定生成版本号和日期的。在VerGen.Java的main方法上有提示

这里需要把 org.apache.zookeeper.version.util.VerGen.java 的main方法上添加三个运行参数,args[] ,并且把自动编译删除,要不然运行main方法时,整个项目都会编译。

手动编译VerGen.java

运行VerGen类

运行VerGen类的main方法生成Info.java

然后把Info.java 拖到 org.apache.zookeeper.version 包下就OK了


 评论