Netty 原始碼閱讀之初始環境搭建
推薦 netty 系列原始碼解析合集
Netty 簡介
Netty 是由 JBOSS 提供的一個開源的 java 網路程式設計框架,主要是對 java 的 nio 包進行了再次封裝。Netty 比 java 原生的nio 包提供了更加強大、穩定的功能和易於使用的 api。 netty 的作者是 Trustin Lee,這是一個韓國人,他還開發了另外一個著名的網路程式設計框架,mina。二者在很多方面都十分相似,它們的執行緒模型也是基本一致 。不過 netty 社群的活躍程度要 mina 高得多。
版本選擇:
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 包拉取下來。
中途你可能會遇到如下問題:
這裡的是 1.5 版本,導致我們如果想用些高階的語法會完全報錯。
如果你把這個版本設定為 8 的版本後,
下面會提示你,專案是從 maven 導過來的,如果 maven 配置改變重新 reimport 後,任何在這裡的改變都會丟失。
同時你會看到專案的 Java Compile 版本是 1.5 的,如下圖:
同樣,你在這裡修改,如果 maven 配置改變重新 reimport 後,任何在這裡的改變也都會丟失。我估計碰到這種問題的不少。
總結起來原因就是 maven 中的編譯版本就是 1.5 的,所以才會導致這裡的問題發生,如果想完全修改好(一勞永逸)。請直接對 pom 檔案動刀,就是幹!
只需把大專案(netty-parent)的那個 pom.xml 修改個屬性,把版本資訊提高到 1.8。
在等待它拉取 jar 包吧
搞完了之後發現還有兩個模組(netty-bom、netty-dev-tools)不能設定到 版本,只能手動的和上面那種設定 language level 和 Java compile 為 1.8 了。
最後你會發現這裡的完全沒有報錯了,開心不?
程式碼行數統計
額,看到專案這麼多子模組,你都不知道該從哪裡下手開始看,那麼我就寫了個簡單的 Java 指令碼去大概的統計每個子專案程式碼的行數。先看看統計結果:
整個專案差不多 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/