編譯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://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下載下來,解壓后,放到它需要的目錄底下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM