04.搭建Tomcat源码环境

129 阅读3分钟

源码环境搭建

1.去官网下载源码包

地址

tomcat.apache.org/

图示

12140847dd389589e97dbb95062932c5.png

1451d1f74cb3e58a6baa5d699914eb7d.png

2.去github下载源码包

地址

github.com/apache/tomc…

图示

0770a38c0f03f68572d211042ff292dd.png

3.Maven环境搭建

说明

Tomcat源码不是用Maven作为构建工具,是使用的Ant,这里需要把他转换为Maven项目

新建pom文件

6fd7791b240b8c460951539dc0ce51bb.png

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项目

51d733c51b40c23f96dff11f5f2be246.png

1652a74f1c648995068313a0b9376575.png

4.源码启动

0a22a42cae0e3b1d083126da4e637d0b.png

5.中文乱码问题解决

现象

86c9bdd0da7e5f3d21b89914747622a2.png

解决中文乱码问题

修改getMessage方法

修改org.apache.jasper.compiler.Localizer#getMessage(java.lang.String)方法

345e99b2af4723b891010dd8caaaae33.png

修改getString方法

修改org.apache.tomcat.util.res.StringManager#getString(java.lang.String)

c7a21fbee27cbe77ec0deb5726fe6ad4.png

重启服务观察是否解决

418097703fcf90781042ad5428ca3214.png

6.访问问题

现象

启动成功后,在访问首页的时候,出现了500错误,而且提示 无法为JSP编译类

506bb85cd41fd9a1a3964c2a58f307b1.png

解决

在org.apache.catalina.startup.ContextConfig类中的configureStart方法中,添加一下JSP解析器初始化即可

af2d21d72cdc5d3920e5b425a5e60ac3.png

重启访问

ebed8268a9e89116c190f5b4eb892adb.png

7.源码结构介绍

介绍

在分析Tomcat源码之前,我们先来看下Tomcat源码的结构组成,这样会更加的有利于我们更好的来分析源码

项目源码结构

d440822b140ec22b2aa49755d93f452b.png

类源码结构

介绍

Tomcat源码位于java文件夹下面。这个java文件夹中的每个包的作用,我们简单的来介绍下,后面在分析核心源码的时候会重点讲解

c614c29e6e02e46fcc9898b66dec6fb4.png

我们可以看到在java目录下,分为了两个结构,一个是javax另一个是org.apache这两个包

javax

在javax中保存的是新的JavaEE规范。可以具体来看看每个目录的作用

c25d3e565f832ab3574c107394c796b6.png

模块作用说明
annotationannotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解。
ejbejb是个古老的传说,我们不管
el在jsp中可以使用EL表达式,这么模块解析EL表达式的
mail和邮件相关的规范
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规范

933f79063011b00dce0e87f5ac0a6f18.png

模块作用
catalinacatalina是Tomcat的核心模块,里面完整的实现了Servlet规范,Tomcat启动的主方法也在里面,后面我们分析的重点。
coyotetomcat 的核心代码,负责将网络请求转化后和 Catalina 进行通信。
el这个是上面javax中的el规范的实现
jasper主要负责把jsp代码转换为java代码。
juli日志相关的工具
naming命名空间相关的内容
tomcat各种辅助工具,包括 websocket 的实现。