编译Zookeeper3.4.6源代码并通过Intellij IDEA运行(2020年)
一、问题背景
生产环境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://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年)的更多相关文章
- 在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包
.NET 的开源,有了更多的DIY乐趣.这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb ...
- 编译Android4.3内核源代码
--------------------------------------------------------------------------------------------------- ...
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上
编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水 日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...
- 反编译Apk得到Java源代码
原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...
- 基于Ubuntu 14.04 LTS编译Android4.4.2源代码
转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- Linux下编译VLC for Android源代码总结
转:http://blog.chinaunix.net/uid-26611383-id-3678766.html 由于项目需要,需要一个在android平台能够支持RTSP协议的播放器,由于之前没有a ...
- 编译Android 4.4源代码并烧录到Nexus4
环境准备: 基本环境:ubuntu-12.04-desktop-64bit(裸机或者Windows下虚拟机安装均可,14.04也可以) 其他要求:空闲磁盘空间100G以上,代码部分接近10G,内存越大 ...
- IntelliJ IDEA 运行你的第一个Java应用程序
IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ...
随机推荐
- 吴裕雄--天生自然python学习笔记:Python3 模块
Python3 模块 在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办 ...
- 吴裕雄--天生自然 R语言开发学习:聚类分析(续一)
#-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...
- [SDOI2008] 洞穴勘测 (LCT模板)
bzoj 2049 传送门 洛谷P2147 传送门 这个大佬的LCT详解超级棒的! Link-Cut Tree的基本思路是用splay的森林维护一条条树链. splay的森林,顾名思义,就是若干spl ...
- ehcache缓存框架之二级缓存
ehcache.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:x ...
- 瑞士一苹果店内iPhone突然爆炸致7人入院,iPhone还值得买吗?
与国产手机高歌猛进态势呈现"最萌发展差"的,是以三星.苹果为代表的海外手机厂商在过去一年的疲态.数据显示,2017年小米手机产量较2016年增长幅度达76%,OPPO和vivo则分 ...
- 杂记:Linux下gcc升级
公司要求,需要在CentOS6.5系统下进行一些测试.因为编写的测试程序中使用了一些C++11之后新增的特性,而CentOS6.5中安装的gcc版本为4.4.7,并不支持C++11,所以需要对gcc进 ...
- IP 转发分组的流程
IP 转发分组的流程 数据路由:路由器在不同网段转发数据包: 网络畅通的条件:数据包能去能回: 从源网络发出时,沿途的每一个路由器必须知道到目标网络下一跳给哪个接口: 从目标网络返回时,沿途的每一个路 ...
- 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结
达拉草201771010105<面向对象程序设计(java)>第十七周学习总结 第一部分:理论知识 1.多线程的概念: (1)多线程是进程执行过程中产生的多条执行线索. (2)多线程意味着 ...
- 记一次crontab执行和日志生成问题
一.crontab未执行 crontab里面设置定时任务如下: 1 19 * * * /usr/bin/python3 /home/nola/a.py > /home/nola/logs/a_l ...
- [Statistics] Comparison of Three Correlation Coefficient: Pearson, Kendall, Spearman
There are three popular metrics to measure the correlation between two random variables: Pearson's c ...