一、问题背景

生产环境Windows机器上用的Zookeeper 3.4.6,最近经常报如下异常:

经过搜索,看到一篇帖子可以解决:https://www.jianshu.com/p/73eec030db86

但需要通过编译Zookeeper源代码的方式进行解决,于是有了本文的一番操作

二、编译过程

1.从Github上下载ZooKeeper源代码

https://github.com/apache/zookeeper

2.下载并安装Ant:http://ant.apache.org/

ZooKeeper 3.4.6是基于Ant进行构建的,不是基于Maven

下载时需要根据JDK版本,下载不同的Ant版本

我安装的是JDK1.8,所以下载了Ant 1.10版本

The Apache Ant team currently maintains two lines of development. 
The 1.9.x releases require Java5 at runtime and 1.10.x requires Java8 at runtime.

 解压后,在Windows环境变量中设置一下ANT_HOME

并在PATH环境变量中添加ANT的bin目录

3.修改http为https

这是ZooKeeper编译过程中最坑的一个地方!

访问http://repo1.maven.org时始终有问题,用了梯子也不好使,搜了一下,原来对Maven中央仓库的访问,从2020年1月15日起,不再支持http了:

https://central.sonatype.org/articles/2019/Apr/30/http-access-to-repo1mavenorg-and-repomavenapacheorg-is-being-deprecated/

https://blog.sonatype.com/central-repository-moving-to-https

https://twitter.com/sonatype_ops

修改下载的Zookeeper源代码根目录底下的ivysettings.xml,将里面的http改为https:

修改下载的Zookeeper源代码根目录底下的build.xml,将里面的http改为https:

4.打开CMD命令窗口,切换到下载的Zookeeper源代码根目录,执行ant eclipse命令,如果看到下面的画面,恭喜编译成功了:

5.导入到Intellij IEDA

前几个步骤执行完,构建的是一个Eclipse工程,所以导入到Intellij IDEA时,要选择Eclipse

选择jdk 1.8

看build.xml中,java编译的版本是1.5

    <property name="javac.target" value="1.5" />
<property name="javac.source" value="1.5" />所以  

所以需要在Settings中设置编译的目标字节码输出为jdk 5:

在Project Structure中设置语言级别为jdk 5:

三、运行编译后的ZooKeeper

1.将conf目录下的zoo_sample.cfg复制为zoo.cfg,并设置dataDir以及dataLogDir:

2.找到运行主类:org.apache.zookeeper.server.ZooKeeperServerMain,并设置启动配置

3.启动ZooKeeper

四、解决生产环境异常:java.nio.channels.CancelledKeyException

1.根据补丁文件,修改源代码:

第一处修改:

第二处修改:

第三处修改:

2.生成新的jar

在Intellij IDEA中设置Ant编译,点击jar阶段,会在build目录生成最终的ZooKeeper-3.4.6.jar

五、解决编译时下载不了jar包

1.准备一个梯子,设置代理

下载过程中,需要从墙外下载大量的 jar包,有了梯子,会省很多事

打开Zookeeper源代码根目录底下的build.xml,增加针对梯子的代理

2.在编译的过程中,如果没有梯子或者有梯子也不管用,可以看看报错的行数,比如:

如果这些编译时下载不下来,可以看看它的条件,就是“除非相应的jar已经存在”,否则就去下载

改的时候,要注意那个“usetimestamp”,如果是true,改为false,否则编译时可能不认我们手动下载的那个jar,因为时间戳可能对不上

将相关的jar下载下来,解压后,放到它需要的目录底下:

编译Zookeeper3.4.6源代码并通过Intellij IDEA运行(2020年)的更多相关文章

  1. 在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包

    .NET 的开源,有了更多的DIY乐趣.这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb ...

  2. 编译Android4.3内核源代码

     --------------------------------------------------------------------------------------------------- ...

  3. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码       ...

  4. 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上

    编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水  日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...

  5. 反编译Apk得到Java源代码

    原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...

  6. 基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码     ...

  7. Linux下编译VLC for Android源代码总结

    转:http://blog.chinaunix.net/uid-26611383-id-3678766.html 由于项目需要,需要一个在android平台能够支持RTSP协议的播放器,由于之前没有a ...

  8. 编译Android 4.4源代码并烧录到Nexus4

    环境准备: 基本环境:ubuntu-12.04-desktop-64bit(裸机或者Windows下虚拟机安装均可,14.04也可以) 其他要求:空闲磁盘空间100G以上,代码部分接近10G,内存越大 ...

  9. IntelliJ IDEA 运行你的第一个Java应用程序

    IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ...

随机推荐

  1. C# 输出&输入&类型强制转换

    输入字符串 String s; s=Console.ReadLine(); 输出字符串 Console.WritrLine(s); 输出分两种 ①占位符输出:Console.WriteLine(&qu ...

  2. Ionic3学习笔记(十)实现夜间模式功能

    本文为原创文章,转载请标明出处 目录 创建主题样式 导入 variables.scss 创建 provider 创建 page 在 App 入口处应用主题 效果图 1. 创建主题样式 在 ./src/ ...

  3. Centos7上pkg-config的安装

    1.官网下载自己想要的版本,我这里下载的是目前最新版 https://www.freedesktop.org/wiki/Software/pkg-config/ 2.安装 tar xf XXX.tgz ...

  4. kafka&&kafka-manager部署安装

    一.zk集群部署 二.kafka部署安装 1.创建kafka用户和日志路径,(直接执行) groupadd kafka useradd -g kafka kafka mkdir -p /web/kaf ...

  5. 重大改革!Python将被加入高考科目!

    未来大学生将分为两种:一种是编程好的人,另一种是编程超好的人. Python 将被纳入高考科目 近期,浙江省信息技术课程改革方案出台,Python 确定进入浙江省信息技术高考,从2018年起浙江省信息 ...

  6. C++走向远洋——52(十三周阅读程序)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. 基本类型和引用类型的值 [重温JavaScript基础(一)]

    前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类 ...

  8. 彻底消灭if-else嵌套

    一.背景 1.1 反面教材 不知大家有没遇到过像横放着的金字塔一样的if-else嵌套: if (true) { if (true) { if (true) { if (true) { if (tru ...

  9. Scrum 敏捷实践中的三大角色

    在我过去的近两年工作中,我们一直在应用 Scrum 敏捷项目管理方法来开展工作,今天,我先从它的角色划分来讲起,毕竟这可是它最鲜明的特征. 首先,为什么这种项目管理方法叫 Scrum ? Scrum ...

  10. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...