一、問題背景
生產環境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下載下來,解壓后,放到它需要的目錄底下: