Hexo

点滴积累 豁达处之

0%

zookeeper源码编译

zookeeper源码分析

源码编译

环境准备

  • Maven:3.5.4
  • Jdk:1.8.0_201
  • idea:2019.1 Community Edition(社区版)

源码地址

官网地址:https://github.com/apache/zookeeper

本例下载的是 release-3.5.8 版本,下载完后解压。

使用idea打开项目进行编译

  • 导入Idea:File –> Open –> 选择ZooKeeper项目目录 zookeeper-3.5.8

  • 添加Info文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...\zookeeper-release-3.5.8\zookeeper-server\src\main\java\org\apache\zookeeper\version\Info.java

    package org.apache.zookeeper.version;

    public interface Info {
    int MAJOR = 1;
    int MINOR = 0;
    int MICRO = 0;
    String QUALIFIER = null;
    int REVISION = -1;
    String REVISION_HASH = "1";
    String BUILD_DATE = "2020‐10‐15";
    }
  • 编译命令:mvn clean package -Dmaven.test.skip=true

可能出现的问题

问题1:

1
[ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (default) on project zookeeper: Properties could not be loaded from File: /Users/h__d/Documents/git-repository/zookeeper-3.6.0/zookeeper-server/src/main/resources/git.properties -> [Help 1]

​ 分析:缺少了 zookeeper-3.6.0/zookeeper-server/src/main/resources/git.properties 文件,而properties-maven-plugin需要使用此文件(不明白为啥没有自行生成该问题)

 解决:添加 git.properties 文件,内容如下,最好不要注释插件,否则还会有问题

1
2
3
4
# git提交id(编一个,或使用github上的id)
git.commit.id=9758d25
# 构建时间
build.time=2021-05-26

运行Zookeeper服务端

1)添加配置文件,复制conf/zoo_sample.cfg,重命名文zoo.cfg

1
...\zookeeper-release-3.5.8\conf\路径下添加zoo.cfg文件

Zookeeper_code01

2)配置日志配置文件:将conf/log4j.properties 复制到 zookeeper-server/src/main/resources 下面

    且在zookeeper-server下src/main/resource上,鼠标右键,Mark Directory as -> Root Resources

Zookeeper_code02

3)找到服务端启动类

分析 bin/zkServer.sh 启动脚本 -> 找到 start 启动参数对应的逻辑 -> 找到主启动类参数:ZOOMAIN -> ZOOMAIN的值:org.apache.zookeeper.server.quorum.QuorumPeerMain

Zookeeper_code03

找到 ZOOMAIN=”org.apache.zookeeper.server.quorum.QuorumPeerMain”,QuorumPeerMain即为服务端主启动类 ZOOCFG=”$2” 可知是通过外部传参进来的

4)运行QuorumPeerMain服务端主启动类,且进行运行配置

Zookeeper_code04

可能出现的问题

问题一:

1
2
3
4
5
java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Connector
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
......
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.Connector

解决:

pom.xml中修改jetty-server的配置,将scope的provided修改为compile:

1
2
3
4
5
6
7
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.8</version>
<!--<scope>provided</scope>-->
<scope>compile</scope>
</dependency>

用客户端命令连接源码启动的server:

1
bin/zkCli.sh ‐server 127.0.0.1:2181

参考链接