源码环境搭建
1.去官网下载源码包
地址
图示
2.去github下载源码包
地址
图示
3.Maven环境搭建
说明
Tomcat源码不是用Maven作为构建工具,是使用的Ant,这里需要把他转换为Maven项目
新建pom文件
pom文件粘贴以下内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.tomcat</groupId>
<artifactId>apache-tomcat</artifactId>
<version>8.5</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.4</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<finalName>apache-tomcat</finalName>
<sourceDirectory>java</sourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
设置为Maven项目
4.源码启动
5.中文乱码问题解决
现象
解决中文乱码问题
修改getMessage方法
修改org.apache.jasper.compiler.Localizer#getMessage(java.lang.String)方法
修改getString方法
修改org.apache.tomcat.util.res.StringManager#getString(java.lang.String)
重启服务观察是否解决
6.访问问题
现象
启动成功后,在访问首页的时候,出现了500错误,而且提示 无法为JSP编译类
解决
在org.apache.catalina.startup.ContextConfig类中的configureStart方法中,添加一下JSP解析器初始化即可
重启访问
7.源码结构介绍
介绍
在分析Tomcat源码之前,我们先来看下Tomcat源码的结构组成,这样会更加的有利于我们更好的来分析源码
项目源码结构
类源码结构
介绍
Tomcat源码位于java文件夹下面。这个java文件夹中的每个包的作用,我们简单的来介绍下,后面在分析核心源码的时候会重点讲解
我们可以看到在java目录下,分为了两个结构,一个是javax另一个是org.apache这两个包
javax
在javax中保存的是新的JavaEE规范。可以具体来看看每个目录的作用
| 模块 | 作用说明 |
|---|---|
| annotation | annotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解。 |
| ejb | ejb是个古老的传说,我们不管 |
| el | 在jsp中可以使用EL表达式,这么模块解析EL表达式的 |
| 和邮件相关的规范 | |
| persistence | 持久化相关的 |
| security | 和安全相关的内容 |
| servlet | 这个指定的是Servlet的开发规范,Tomcat本质上就是一个实现了Servlet规范的一个容器,Servlet定义了服务端处理Http请求和响应的方式(规范) |
| websocket | 定义了使用 websocket 协议的服务端和客户端 API |
| xml.ws | 定义了基于 SOAP 协议的 xml 方式的 web 服务 |
org.apache
org.apache这个包是Tomcat的源码包,也是针对上面的JavaEE规范的部分实现,Tomcat的本质就是对JavaEE的某些规范的实现合集,首先肯定实现了Servlet规范
| 模块 | 作用 |
|---|---|
| catalina | catalina是Tomcat的核心模块,里面完整的实现了Servlet规范,Tomcat启动的主方法也在里面,后面我们分析的重点。 |
| coyote | tomcat 的核心代码,负责将网络请求转化后和 Catalina 进行通信。 |
| el | 这个是上面javax中的el规范的实现 |
| jasper | 主要负责把jsp代码转换为java代码。 |
| juli | 日志相关的工具 |
| naming | 命名空间相关的内容 |
| tomcat | 各种辅助工具,包括 websocket 的实现。 |