zookeeper源码编译(mvn)

Posted by Mr.Zhou on January 13, 2020

背景

老版的zk是通过ant进行编译的,但最新的zk源码中已经没了build.xml,而多了pom.xml,也就是说构建方式由原先的Ant变成了Maven,源码下下来后,直接编译、运行是跑不起来的,有一些配置需要调整,这边做下总结。

注意点

导入项目类型

导入类型是Maven,不要再选Eclipse了。

构建项目

点击IDEA最右侧的“Maven”,点击第二个小图标:“Generate Sources and Update Folders For All Projects”。

img

修改jre

打开项目结构(⌘ + ;),指定jdk为1.8

修改gitignore文件

由于开发环境需要进行调试,临时配置文件是不需要进代码仓库的,所以进行排除。

# Ignore debug conf
conf/zoo.cfg
conf/zoo*.cfg
zookeeper-server/src/main/resources/log4j.properties

拷贝配置文件

  1. 拷贝zoo_sample.cfg文件至相同文件夹下,名为:zoo.cfg,配置全部使用默认;
  2. 创建/tmp/zookeeper目录,用于存放zk数据;
  3. 拷贝log4j.properties文件至:zookeeper-server/src/main/resources,文件名还是log4j.properties不变;
  4. 打开项目结构,将resources目录标记为Resources类型(不配置的话日志配置不生效); img

增加运行启动项

配置启动项:

QuorumPeerMain
org.apache.zookeeper.server.quorum.QuorumPeerMain
conf/zoo.cfg

img

增加Info类

默认如果不添加Info类,编译不通过: img

创建Info文件,路径:src/main/java/org/apache/zookeeper/version/Info.java

public interface Info {
    public static final int MAJOR=3;
    public static final int MINOR=4;
    public static final int MICRO=6;
    public static final String QUALIFIER=null;
    public static final int REVISION=-1;
    public static final String REVISION_HASH = "1";
    public static final String BUILD_DATE="12/25/2019 09:55 GMT";
}

修改pom.xml

默认的pom.xml有问题,直接编译多少都会报找不到类的错,需要手工调整:

  • java.lang.ClassNotFoundException: com.codahale.metrics.Reservoir
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>3.1.0</version>
    </dependency>
    
  • java.lang.ClassNotFoundException: org.xerial.snappy.SnappyInputStream
    <dependency>
      <groupId>org.xerial.snappy</groupId>
      <artifactId>snappy-java</artifactId>
      <version>1.1.7.3</version>
    </dependency>
    
  • java.lang.ClassNotFoundException: org.eclipse.jetty.server.HttpConfiguration$Customizer
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
    </dependency>
    
  • java.lang.ClassNotFoundException: org.eclipse.jetty.servlet.ServletContextHandler
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
    </dependency>
    

全部修改完毕后,服务端可以正常启动: img

创建客户端启动项

配置启动项:

ZooKeeperMain
org.apache.zookeeper.ZooKeeperMain

img

修改pom.xml

  • java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
    <dependency>
      <groupId>commons-cli</groupId>
      <artifactId>commons-cli</artifactId>
    </dependency>
    

全部修改完毕后,客户端可以正常启动: img

提示没有Info文件

需要手工生成下,操作方法:

  1. 清理历史target文件:
    img

  2. 重新生成新target文件:
    img

  3. 获取最新Info类,生成路径为:zookeeper-server/target/generated-sources/java/org/apache/zookeeper/version/Info.java

package org.apache.zookeeper.version;

public interface Info {
    int MAJOR=3;
    int MINOR=7;
    int MICRO=0;
    String QUALIFIER="SNAPSHOT";
    String REVISION_HASH="c50c132a7d7da7c5e68ed195b3290c7cc96cfc4d";
    String BUILD_DATE="04/04/2020 14:30 GMT";
}

如果之前手工创建了Info日志,IDE则会提示Info文件重复,需要把之前手工创建的删除。

Console又不显示日志了

原因未知,但试了下,把log4j.properties文件挪到zookeeper-server/src/main/java目录下,再挪回zookeeper-server/src/main/resources目录下,重新运行就恢复了。