1. 程式人生 > >Netty 原始碼閱讀之初始環境搭建

Netty 原始碼閱讀之初始環境搭建

推薦 netty 系列原始碼解析合集

http://www.iocoder.cn/Netty/Netty-collection/?aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3R6c18xMDQxMjE4MTI5L2FydGljbGUvZGV0YWlscy83ODc1NjUyNwo=

Netty 簡介

Netty 是由 JBOSS 提供的一個開源的 java 網路程式設計框架,主要是對 java 的 nio 包進行了再次封裝。Netty 比 java 原生的nio 包提供了更加強大、穩定的功能和易於使用的 api。 netty 的作者是 Trustin Lee,這是一個韓國人,他還開發了另外一個著名的網路程式設計框架,mina。二者在很多方面都十分相似,它們的執行緒模型也是基本一致 。不過 netty 社群的活躍程度要 mina 高得多。

版本選擇:

mark

3.x 目前企業使用最多的版本,最為穩定。例如dubbo使用的就是3.x版本

4.x 引入了記憶體池等重大特性,可以有效的降低GC負載,rocketmq使用的就是4.x

5.x 已經被廢棄了,具體可參見 https://github.com/netty/netty/issues/4466

所以這裡我搭建的原始碼閱讀環境是存在的 4.1 版本。

準備工具

  • IDEA 2017

環境搭建

在 IDEA 中匯入專案地址:https://github.com/netty/netty.git ,然後就會自動下載專案所有的依賴,但是請注意:

必須在 IDEA 中將 Profiles 中的所有都勾選上

,否則會導致很多 jar 包拉不下來,如下圖:

mark

然後就是耐心等待了,一直到所有的 jar 包拉取下來。

中途你可能會遇到如下問題:

mark

這裡的是 1.5 版本,導致我們如果想用些高階的語法會完全報錯。

如果你把這個版本設定為 8 的版本後,

mark

下面會提示你,專案是從 maven 導過來的,如果 maven 配置改變重新 reimport 後,任何在這裡的改變都會丟失。

同時你會看到專案的 Java Compile 版本是 1.5 的,如下圖:

mark

同樣,你在這裡修改,如果 maven 配置改變重新 reimport 後,任何在這裡的改變也都會丟失。我估計碰到這種問題的不少。

總結起來原因就是 maven 中的編譯版本就是 1.5 的,所以才會導致這裡的問題發生,如果想完全修改好(一勞永逸)。請直接對 pom 檔案動刀,就是幹!

只需把大專案(netty-parent)的那個 pom.xml 修改個屬性,把版本資訊提高到 1.8。

mark

在等待它拉取 jar 包吧

搞完了之後發現還有兩個模組(netty-bom、netty-dev-tools)不能設定到 版本,只能手動的和上面那種設定 language level 和 Java compile 為 1.8 了。

最後你會發現這裡的完全沒有報錯了,開心不?

mark

程式碼行數統計

額,看到專案這麼多子模組,你都不知道該從哪裡下手開始看,那麼我就寫了個簡單的 Java 指令碼去大概的統計每個子專案程式碼的行數。先看看統計結果:

mark

整個專案差不多 23 萬。(過濾了空行、各種註釋和 @Override 之後的 Java 程式碼行數),靠這個數字很嚇人!

來看看我的指令碼程式碼吧:

public static void main(String[] args) throws Exception {
    long count = Files.walk(Paths.get("C:\\JetBrains\\IDEAProject\\netty\\transport-udt"))    // 遞迴獲得專案目錄下的所有檔案
            .filter(file -> !Files.isDirectory(file))   // 篩選出檔案
            .filter(file -> file.toString().endsWith(".java"))  // 篩選出 java 檔案
            .flatMap(Try.of(file -> Files.lines(file), Stream.empty()))     // 將會丟擲受檢異常的 Lambda 包裝為 丟擲非受檢異常的 Lambda
            .filter(line -> !line.trim().isEmpty())         // 過濾掉空行
            .filter(line -> !line.trim().startsWith("//"))  //過濾掉 //之類的註釋
            .filter(line -> !(line.trim().startsWith("/*") && line.trim().endsWith("*/")))  //過濾掉/* */之類的註釋
            .filter(line -> !(line.trim().startsWith("/*") && !line.trim().endsWith("*/")))     //過濾掉以 /* 開頭的註釋(去除空格後的開頭)
            .filter(line -> !(!line.trim().startsWith("/*") && line.trim().endsWith("*/")))     //過濾掉已 */ 結尾的註釋
            .filter(line -> !line.trim().startsWith("*"))   //過濾掉 javadoc 中的文字註釋
            .filter(line -> !line.trim().startsWith("@Override"))   //過濾掉方法上含 @Override 的
            .count();
    System.out.println("程式碼行數:" + count);
}

後面我會把我閱讀原始碼的中文註釋及解析之類的更新到我的 GitHub 去(歡迎關注、我是來騙 star 的),https://github.com/zhisheng17/netty ,如果你不想去自己設定上面所說的這些(偷懶),那就直接 fork 我的這份吧!

最後

環境搭建就寫到這裡了,轉載請註明地址:http://www.54tianzhisheng.cn/2017/12/08/netty-01-env/