一,前言

这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地。最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间就造个轮子。

看源码,总不能干看,边看边改,验证想法。所以这个系列从构建 tomcat 开始。首先要声明的是,以前没有完整看过一个项目的经历,tomcat 是第一次尝试看的源码。因此,这个系列可能存在描述不正确的问题,希望读者能帮忙指正。最后,感谢您的阅读!

这篇博客主要内容是,在 Windows 上,使用 Intellj-IDEA 编译运行 Tomcat。

二,问题

读源代码,要带着问题去阅读。有一些是自己想的,有一些是 How Tomcat Works[2] 的目录,还有一些来自于别人的博客[3]。

  1. 一个 Http 请求和响应,是如何转变成 Servlet 的请求和相应的?
  2. Servlet 是如何抽象 Http 请求的?
  3. Tomcat 如何管理 tcp 连接?
  4. Tomcat 如何管理输入输出流?
  5. Tomcat 的生命周期,如何启动的?如何运行?
  6. Session 如何管理?
  7. 如何加载类?
  8. Tomcat 如何管理 servlet 容器,如何连接?

问题就暂且提出这些。不知道这个 Tomcat 源码阅读系列是否能够完成呢(/▽\)。不管怎样,先搭个环境,用自己喜欢的 IDE(IntelliJ IDEA) 来阅读、调试源码。

三,步骤

  1. 下载源代码,这里在 github 上下载
  2. 选择正确的 JDK 版本,官方使用的是 JDK 8
  3. 下载 Ant 工具,Tomcat 使用 Ant 来构建
  4. 配置依赖包的下载位置
  5. 使用 Ant 构建
  6. 使用 Ant 创建 IDE 工程,IDE 支持 Intellij-IDEA,NetBean,Eclipse

获取源代码,安装对应的 JDK 版本,下面就不解释了。下面主要讲讲如何使用 Ant 工具来开发,在写这篇博客之前,其实我自己也没有想到构建 Tomcat 是很简单的事情。官方还很贴心的考虑到了,开发者可能会使用 IDE 来开发,于是给开发者配置好了环境。使用对应的 Ant 任务就可以有对应 IDE 的工程文件了。下面的步骤,具体可以看官方的构建步骤

1 安装 Ant

直接去这里下载 Ant 的包,然后配置环境变量。

添加一个新的环境变量:

变量名:ANT_HOME
变量值:C:\Program Files\apache-ant-1.9.15

增加如下到 Path 中。

变量值:%ANT_HOME%\bin

在 cmd 当中输入 ant,如果可以找到命令,那么说明成功了。

2 配置下载位置

进入下载好的 Tomcat 目录中,我这里 tomcat 的根目录是 D:\Code\tomcat

新建一个文件 build.properties,复制以下的内容。指定依赖包的保存地址。

# ----- Default Base Path for Dependent Packages -----
# Replace this path with the directory path where dependencies binaries
# should be downloaded
base.path=D:\\Code\\tomcat\\lib

3 使用 Ant 构建

输入 ant 即可,他会先下载构建需要的包,然后构建项目。

4 使用 IDEA 构建

输入命令 ant ide-intellij 即可构建 IDEA 的项目。官方还提供了 eclipse 和 netbean。

接下来,就会下载 IDEA 需要的包,并且会将提供的项目文件复制到 Tomcat 目录下。之后就可以使用 IDEA 来打开了。

5 Bug

官方的代码里面,build.properties.defaultres\ide-support 下的版本对应不上,于是会出现下面的报错。下面给出两种解决方案。

解决方案一

添加依赖。

打开 Project Structure

添加依赖

解决方案二

修改 res\ide-support\idea\tomcat.iml 中对应的版本,然后重新构建就好了。

四,运行

Tomcat 的运行有两种方式,一种是使用官方的脚本来运行,另一种是使用 org.apache.catalina.startup 中的 BootStrap 类。

方式一

首先使用 ant 构建好项目,然后进入 output\build 文件夹。

接着修改 conf\logging.properties 下的编码,不然控制台要输出乱码了。

最后进入,bin\startup.bat 双击一下就可以运行了。进入 http://localhost:8080/ 就可以查看是否运行成功。

方式二

使用 org.apache.catalina.startup 中的 BootStrap 类。使用 IDEA 来启动这个类。首先要配置好参数,我们把方式一中的命令行参数拷贝到 IDEA 的启动参数里面即可。

不过 IDEA 的控制台输出仍然会有乱码,可以选择使用英文来避免这个问题。

-Djava.util.logging.config.file=D:\Code\tomcat\output\build\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dcatalina.base=D:\Code\tomcat\output\build
-Dcatalina.home=D:\Code\tomcat\output\build
-Djava.io.tmpdir=D:\Code\tomcat\output\build\temp
-Dfile.encoding=UTF-8
-Duser.language=en
-Duser.region=US

点击启动!so easy。接下来就是一边阅读源码,一边调试看看了。

参考

[1] https://github.com/apache/tomcat

[2] How Tomcat Works 2

[3] http://www.iocoder.cn/Tomcat/Tomcat-collection/

[4] https://tomcat.apache.org/tomcat-10.0-doc/building.html

【Tomcat 源码系列】源码构建 Tomcat的更多相关文章

  1. 【转】Tomcat源代码阅读系列

    在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码(Tomcat源代码阅读系列之一) Tomcat总体结构(Tomcat源代码阅读系列之二) Tomcat启动过程(Tomcat ...

  2. 【Tomcat 源码系列】认识 Tomcat

    一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...

  3. 【Tomcat 源码系列】Tomcat 整体结构

    一,前言 在开始看源码细节之前,首先要想好要看的问题.想好问题之后,我们该如何寻找要看的代码呢? 其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置.带着问题 ...

  4. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  5. tomcat集群实现源码级别剖析

    随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...

  6. Tomcat处理HTTP请求源码分析(上)

    Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...

  7. 探秘Tomcat(一)——Myeclipse中导入Tomcat源码

    前言:有的时候自己不知道自己是井底之蛙,这并没有什么可怕的,因为你只要蜷缩在方寸之间的井里,无数次的生活轨迹无非最终归结还是一个圆形:但是可怕的是有一天你不得不从井里跳出来生活,需要重新审视井以外的生 ...

  8. 学习tomcat(一)----用IDEA调试tomcat源码

    一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...

  9. Tomcat源码分析一:编译Tomcat源码

    Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...

随机推荐

  1. centos下多网卡做bond脚本

    多网卡或者单网卡形式下的网卡bonding #! /bin/sh #获取当前网卡数 ethnum=`lspci | grep Ethernet | wc -l` echo $ethnum #如果网卡数 ...

  2. 【翻译】指示器(indicator)的分类

    参考 David Bianco在2015年发布的博文: http://detect-respond.blogspot.com/2013/07/on-misuse-of-indicators.html ...

  3. Oracle表和表空间查询

    用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...

  4. Java中常量池详解

    在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...

  5. Pinpoint 更改agentid 和 agent name 长度限制(Pinpoint系列二)

    本文基于 Pinpoint 2.1.0 版本 本文的内容为了更改 ID 和 Name 长度限制,因为有使用容器或者是服务名称确实比较长,所以根据业务场景,我们需要更改源码来实现这个. 具体更改,参考 ...

  6. FL Studio钢琴卷轴之画笔工具

    在FL Studio中,钢琴卷轴窗口是制作音乐很重要的一个窗口,大部分音乐编辑的工作都要在该窗口中完成.钢琴卷轴的概念来源于旧时自动机械钢琴所使用的纸质卷轴,在钢琴卷轴中,纵轴代表音符的高度,横轴代表 ...

  7. python接口测试2-开发WEB接口

    首先要安装flask包: pip install flask 开发一个简单的API接口 # 1. 导入包 from flask import Flask, request # 2. 实例化一个 app ...

  8. PC 端轮播图的实现

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  9. Non Super Boring Substring 题解(hash+思维)

    题目链接 题目大意 给你一个长度为d(d<=1e5)的字符串,要你求有多少个子串满足这个子串不包含长度大于等于k的回文子串 题目思路 首先可以hash预处理,然后O(1)用前缀hash值和后缀h ...

  10. Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法

    ☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...