Netty 源码阅读之初始环境搭建

时间:2022-09-18 15:00:40

Netty 源码阅读之初始环境搭建

Netty 简介

Netty 是由 JBOSS 提供的一个开源的 java 网络编程框架,主要是对 java 的 nio 包进行了再次封装。Netty 比 java 原生的nio 包提供了更加强大、稳定的功能和易于使用的 api。 netty 的作者是 Trustin Lee,这是一个韩国人,他还开发了另外一个著名的网络编程框架,mina。二者在很多方面都十分相似,它们的线程模型也是基本一致 。不过 netty 社区的活跃程度要 mina 高得多。

版本选择:

Netty 源码阅读之初始环境搭建

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 包拉不下来,如下图:

Netty 源码阅读之初始环境搭建

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

中途你可能会遇到如下问题:

Netty 源码阅读之初始环境搭建

这里的是 1.5 版本,导致我们如果想用些高级的语法会完全报错。

如果你把这个版本设置为 8 的版本后,

Netty 源码阅读之初始环境搭建

下面会提示你,项目是从 maven 导过来的,如果 maven 配置改变重新 reimport 后,任何在这里的改变都会丢失。

同时你会看到项目的 Java Compile 版本是 1.5 的,如下图:

Netty 源码阅读之初始环境搭建

同样,你在这里修改,如果 maven 配置改变重新 reimport 后,任何在这里的改变也都会丢失。我估计碰到这种问题的不少。

总结起来原因就是 maven 中的编译版本就是 1.5 的,所以才会导致这里的问题发生,如果想完全修改好(一劳永逸)。请直接对 pom 文件动刀,就是干!

只需把大项目(netty-parent)的那个 pom.xml 修改个属性,把版本信息提高到 1.8。

Netty 源码阅读之初始环境搭建

在等待它拉取 jar 包吧

搞完了之后发现还有两个模块(netty-bom、netty-dev-tools)不能设置到 版本,只能手动的和上面那种设置 language level 和 Java compile 为 1.8 了。

最后你会发现这里的完全没有报错了,开心不?

Netty 源码阅读之初始环境搭建

代码行数统计

额,看到项目这么多子模块,你都不知道该从哪里下手开始看,那么我就写了个简单的 Java 脚本去大概的统计每个子项目代码的行数。先看看统计结果:

Netty 源码阅读之初始环境搭建

整个项目差不多 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/