《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》

摘要: 原创出处 https://juejin.im/post/5a6c3a28518825732739d7cd 「预流」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

《Tomcat 7 源码分析》系列文章是我 2013 年到 2015 年间写在 ITeye 上的相关博客汇总,从后台的访客记录看一直到现在还有很多人在读,也是访问量最多的系列,本来计划要写 8 点:

1. 容器启动,从server到listener、jndi、service到connetor、engine到host到context到wrapper一系列对象的组装,包括Digester的使用、JMX注册、JDK5中的新的线程池启动方式等。

2. 一个socket连接如何转化成request的。

3. 一条请求响应链在容器中流转的经过。

  1. 容器的自定义classloader机制。

  2. session如何实现,特别是集群环境中的session粘滞和session复制的实现。

  3. nio处理方式的实现。

  4. servlet3新规范中websocket的实现。

8. 容器的关闭机制。

结果只写了 1、2、3、8 ,后面有空将再把这个系列写完。我最近也把博客的首发地改到了掘金,为了保持这个系列的完整性,先把以前写过的转过来吧。


以前看过 Tomcat 5 的一部分源代码,当时只看了个大概的启动分析,后来看了《How Tomcat Works》这本书,讲的还行。但出版的较早,所以是基于 Tomcat 4 的代码分析,Tomcat 已经 release 到 7 (2013年的时候)了,很多后来添加的特性与新的实现方式那本书里面没有涉及。下半年业余时间的主要任务就是完成 Tomcat 7 各个我感兴趣的点的系列文章。

先说下我的源码分析的环境搭建吧,用的是 eclipse Juno Service Release 1,然后在 tomcat官网下了 tomcat7.0.42的源码 ,这两样准备好之后便是搭建能够运行源码的调试环境了。

  1. 在 eclipse 中新建一个 java 项目,项目取名 tc7.0.42

img JRE 选择 1.6 的

img 其他设置默认

img \2. 将下载的 tomcat 源码包解压开,并拷贝到 Eclipse 里新建的项目根目录下

img 注意,我这里将源码解压开后的 bin 目录重命名成 script 之后才拷贝的,因为新建的 Java 项目中默认编译后的文件存放目录是 bin ,这样做防止编译后的文件覆盖原来拷贝过去的内容。

img img \3. 将项目中默认的 src 目录删掉,java 和 test 作为源目录

点击查看原始大小图片

点击查看原始大小图片 \4. 此时会发现项目中缺少一些类,需要手动将依赖的 jar 包添加进来,所以新建了一个 depend-lib 目录

img \5. 实际上缺少的这些 jar 包 eclipse 安装目录里面都有,直接拷贝过来就可以了。

在 eclipse 安装目录的 plugins 目录下,搜索 "ant.jar"

img 搜索 "javax.wsdl" ,选版本较高的那个 jar 包

点击查看原始大小图片 搜索 "jaxrpc"

点击查看原始大小图片 搜索 "jdt.core" 选最大的那个 jar 包

点击查看原始大小图片 \6. 把这些 jar 包加入到编译路径里

img \7. 此时发现 test 目录下还有错误,实际上是因为 test 里面用到了 junit 的一些注解,所以需要将 junit4 引进来

右击项目,点击 Build Path ,选择 Add Libraries

img 选择 junit

img 下一步,junit 版本选择 JUnit 4

img

自此整个项目应该可以编译了。

\8. 接下来运行项目根目录下的 build.xml ,执行默认的 ant 任务,看看项目构建的有没有问题。

img

点击查看原始大小图片

控制台输出 "BUILD SUCCESSFUL" 表示编译构建成功。

点击查看原始大小图片

\9. 此时刷新整个项目,会发现多出一个 output 目录

img

\10. 为了让应用跑起来,可以检查一下 output\build\conf 下是否已经有配置文件,这些文件实际是从项目根路径 conf 目录下拷贝过来的。

\11. 找到 BootStarp.java 文件,Debug 前加入默认的 catalina home 路径作为启动参数。

BootStarp.java 文件右键选择 Debug As -> Debug Configurations

点击查看原始大小图片 路径设置为 output 下 build 的绝对路径。比如我自己的机器设置的值是 -Dcatalina.home="E:\workspace\study\tc7.0.42\output\build"

点击查看原始大小图片

文章目录