从apache tomcat下载tomcat8源码
1.下载到源码后,tomcat默认使用ant作为包管理工具,本地调试时创建pom.xml, 手动创建一个pom.xml放入源码根目录
"1.0" encoding="UTF-8"?>
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.apache.tomcat
Tomcat8.0
Tomcat8.0
8.0
Tomcat8.0
java
test
java
test
org.apache.maven.plugins
maven-compiler-plugin
2.0.2
UTF-8
1.8
org.easymock
easymock
5.0.0
test
com.unboundid
unboundid-ldapsdk
6.0.4
test
ant
ant
1.7.0
ant
ant-apache-log4j
1.6.5
ant
ant-commons-logging
1.6.5
wsdl4j
wsdl4j
1.6.2
javax.xml.rpc
javax.xml.rpc-api
1.1
org.eclipse.jdt.core.compiler
ecj
4.6.1
junit
junit
4.12
test
2.使用idea导入tomcat源码 File->Project from Existing Sources -> Maven import
重新导入依赖后TestCookieFilter会报错,本地注释掉单元测试类即可。
3.编辑配置文件, Edit Configuration, 如下图。
设置catalina.home和tomcat启动类Bootstrap, jdk我选择的是1.8
4.Maven Reload, 把依赖的包重新导入进来。
添加JSP解析器代码:
1.Servlet.service() for servlet [jsp] in context with path [] threw exception [org.apache.jasper.JasperException: Unable to compile class for JSP] with root cause
解决方案:编辑 org.apache.catalina.startup.ContextConfig 文件的 configureStart() 方法,添加初始化 JSP 解析器的代码:
在ContextConfig类的configStart方法中加入以下代码
context.addServletContainerInitializer(new JasperInitializer(), null);
我本地下载的tomcat8源码, 以上工作准备完后,直接编译,单元测试也没报错。运行起来,就可以看到猫咪了, 可以开心的看源码了。
我本地的源码config/server.xml里配置的是8080端口, 这里就跑起来了。
tomcat源码目录结构
tomcat核心源码
CATALINA_HOME和CATALINA_BASE
开始阅读tomcat源码之前,先浏览一遍tomcat官方写的介绍,里面内容很全,也是我们学习的第一手资料,这里涉及到两个变量CATALINA_HOME和CATALINA_BASE。
- CATALINA_HOME:表示 Tomcat 安装的根目录,即D:\Gitee\tomcat8\apache-tomcat-8.5.85-src
- CATALINA_BASE:表示特定 Tomcat 实例的运行时配置的根。如果你需要在一台机器上配置多个tomcat实例,则需要用到catalina_base变量
为什么使用CATALINA_BASE
默认情况下,CATALINA_HOME和CATALINA_BASE指向同一目录。当您需要在一台计算机上运行多个 Tomcat 实例时,手动设置CATALINA_BASE。这样做具有以下优点:
- 更轻松地管理升级到较新版本的 Tomcat。由于具有单个CATALINA_HOME位置的所有实例共享一组文件和二进制文件,因此您可以轻松地将文件升级到较新版本,并将更改传播到使用同一CATALIA_HOME目录的所有 Tomcat 实例。
- 避免重复相同的bin、lib文件夹的文件。
- 共享某些设置的可能性,例如 shell 或 bat 脚本文件(取决于您的操作系统)。