【Tomcat 源码系列】源码构建 Tomcat
一,前言
这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地。最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间就造个轮子。
看源码,总不能干看,边看边改,验证想法。所以这个系列从构建 tomcat 开始。首先要声明的是,以前没有完整看过一个项目的经历,tomcat 是第一次尝试看的源码。因此,这个系列可能存在描述不正确的问题,希望读者能帮忙指正。最后,感谢您的阅读!
这篇博客主要内容是,在 Windows 上,使用 Intellj-IDEA 编译运行 Tomcat。
二,问题
读源代码,要带着问题去阅读。有一些是自己想的,有一些是 How Tomcat Works[2] 的目录,还有一些来自于别人的博客[3]。
- 一个 Http 请求和响应,是如何转变成 Servlet 的请求和相应的?
- Servlet 是如何抽象 Http 请求的?
- Tomcat 如何管理 tcp 连接?
- Tomcat 如何管理输入输出流?
- Tomcat 的生命周期,如何启动的?如何运行?
- Session 如何管理?
- 如何加载类?
- Tomcat 如何管理 servlet 容器,如何连接?
问题就暂且提出这些。不知道这个 Tomcat 源码阅读系列是否能够完成呢(/▽\)。不管怎样,先搭个环境,用自己喜欢的 IDE(IntelliJ IDEA) 来阅读、调试源码。
三,步骤
- 下载源代码,这里在 github 上下载
- 选择正确的 JDK 版本,官方使用的是 JDK 8
- 下载 Ant 工具,Tomcat 使用 Ant 来构建
- 配置依赖包的下载位置
- 使用 Ant 构建
- 使用 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.default
和 res\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的更多相关文章
- 【转】Tomcat源代码阅读系列
在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码(Tomcat源代码阅读系列之一) Tomcat总体结构(Tomcat源代码阅读系列之二) Tomcat启动过程(Tomcat ...
- 【Tomcat 源码系列】认识 Tomcat
一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...
- 【Tomcat 源码系列】Tomcat 整体结构
一,前言 在开始看源码细节之前,首先要想好要看的问题.想好问题之后,我们该如何寻找要看的代码呢? 其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置.带着问题 ...
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- tomcat集群实现源码级别剖析
随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...
- 探秘Tomcat(一)——Myeclipse中导入Tomcat源码
前言:有的时候自己不知道自己是井底之蛙,这并没有什么可怕的,因为你只要蜷缩在方寸之间的井里,无数次的生活轨迹无非最终归结还是一个圆形:但是可怕的是有一天你不得不从井里跳出来生活,需要重新审视井以外的生 ...
- 学习tomcat(一)----用IDEA调试tomcat源码
一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...
- Tomcat源码分析一:编译Tomcat源码
Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...
随机推荐
- centos下多网卡做bond脚本
多网卡或者单网卡形式下的网卡bonding #! /bin/sh #获取当前网卡数 ethnum=`lspci | grep Ethernet | wc -l` echo $ethnum #如果网卡数 ...
- 【翻译】指示器(indicator)的分类
参考 David Bianco在2015年发布的博文: http://detect-respond.blogspot.com/2013/07/on-misuse-of-indicators.html ...
- Oracle表和表空间查询
用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...
- Java中常量池详解
在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...
- Pinpoint 更改agentid 和 agent name 长度限制(Pinpoint系列二)
本文基于 Pinpoint 2.1.0 版本 本文的内容为了更改 ID 和 Name 长度限制,因为有使用容器或者是服务名称确实比较长,所以根据业务场景,我们需要更改源码来实现这个. 具体更改,参考 ...
- FL Studio钢琴卷轴之画笔工具
在FL Studio中,钢琴卷轴窗口是制作音乐很重要的一个窗口,大部分音乐编辑的工作都要在该窗口中完成.钢琴卷轴的概念来源于旧时自动机械钢琴所使用的纸质卷轴,在钢琴卷轴中,纵轴代表音符的高度,横轴代表 ...
- python接口测试2-开发WEB接口
首先要安装flask包: pip install flask 开发一个简单的API接口 # 1. 导入包 from flask import Flask, request # 2. 实例化一个 app ...
- PC 端轮播图的实现
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- Non Super Boring Substring 题解(hash+思维)
题目链接 题目大意 给你一个长度为d(d<=1e5)的字符串,要你求有多少个子串满足这个子串不包含长度大于等于k的回文子串 题目思路 首先可以hash预处理,然后O(1)用前缀hash值和后缀h ...
- Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法
☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...