源码构建

下载源码

image.png

源码导⼊IDE之前准备⼯作

  1. 解压 tar.gz 压缩包,得到⽬录 apache-tomcat-8.5.50-src
  2. 进⼊ apache-tomcat-8.5.50-src ⽬录,创建⼀个pom.xml⽂件,⽂件内容如下
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
    6. <modelVersion>4.0.0</modelVersion>
    7. <groupId>org.apache.tomcat</groupId>
    8. <artifactId>apache-tomcat-8.5.50-src</artifactId>
    9. <name>Tomcat8.5</name>
    10. <version>8.5</version>
    11. <build>
    12. <!--指定源⽬录-->
    13. <finalName>Tomcat8.5</finalName>
    14. <sourceDirectory>java</sourceDirectory>
    15. <resources>
    16. <resource>
    17. <directory>java</directory>
    18. </resource>
    19. </resources>
    20. <plugins>
    21. <!--引⼊编译插件-->
    22. <plugin>
    23. <groupId>org.apache.maven.plugins</groupId>
    24. <artifactId>maven-compiler-plugin</artifactId>
    25. <version>3.1</version>
    26. <configuration>
    27. <encoding>UTF-8</encoding>
    28. <source>11</source>
    29. <target>11</target>
    30. </configuration>
    31. </plugin>
    32. </plugins>
    33. </build>
    34. <!--tomcat 依赖的基础包-->
    35. <dependencies>
    36. <dependency>
    37. <groupId>org.easymock</groupId>
    38. <artifactId>easymock</artifactId>
    39. <version>3.4</version>
    40. </dependency>
    41. <dependency>
    42. <groupId>ant</groupId>
    43. <artifactId>ant</artifactId>
    44. <version>1.7.0</version>
    45. </dependency>
    46. <dependency>
    47. <groupId>wsdl4j</groupId>
    48. <artifactId>wsdl4j</artifactId>
    49. <version>1.6.2</version>
    50. </dependency>
    51. <dependency>
    52. <groupId>javax.xml</groupId>
    53. <artifactId>jaxrpc</artifactId>
    54. <version>1.1</version>
    55. </dependency>
    56. <dependency>
    57. <groupId>org.eclipse.jdt.core.compiler</groupId>
    58. <artifactId>ecj</artifactId>
    59. <version>4.5.1</version>
    60. </dependency>
    61. <dependency>
    62. <groupId>javax.xml.soap</groupId>
    63. <artifactId>javax.xml.soap-api</artifactId>
    64. <version>1.4.0</version>
    65. </dependency>
    66. </dependencies>
    67. </project>

    导⼊源码⼯程到IDE并进⾏配置

  • 将源码⼯程导⼊到 IDEA 中
  • 给 tomcat 的源码程序启动类 Bootstrap 配置 VM 参数,因为 tomcat 源码运⾏也需要加载配置⽂

件等。

  1. -Dcatalina.home=D:/开发相关/lg/java_high_salary_training_camp/第二阶段/第二阶段模块一/课程讲义/Tomcat&Nginx资料/软件包及源码包/apache-tomcat-8.5.50-src/source
  2. -Dcatalina.base=D:/开发相关/lg/java_high_salary_training_camp/第二阶段/第二阶段模块一/课程讲义/Tomcat&Nginx资料/软件包及源码包/apache-tomcat-8.5.50-src/source
  3. -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  4. -Djava.util.logging.config.file=D:/开发相关/lg/java_high_salary_training_camp/第二阶段/第二阶段模块一/课程讲义/Tomcat&Nginx资料/软件包及源码包/apachetomcat-8.5.50-src/source/conf/logging.properties

将目录进行相应替换
image.png
运⾏ Bootstrap 类的 main 函数,此时就启动了tomcat,启动时候会去加载所配置的 conf ⽬录下
的server.xml等配置⽂件,所以访问8080端⼝即可,但此时我们会遇到如下的⼀个错误
image.png
原因是Jsp引擎Jasper没有被初始化,从⽽⽆法编译JSP,我们需要在tomcat的源码ContextConfifig类中
的confifigureStart⽅法中增加⼀⾏代码将 Jsp 引擎初始化,如下
image.png

  1. context.addServletContainerInitializer(new JasperInitializer(),null);

核⼼流程源码剖析

tomcat启动流程
image.png
Tomcat中的各容器组件都会涉及创建、销毁等,因此设计了⽣命周期接⼝Lifecycle进⾏统⼀规范,各容
器组件实现该接⼝。

Lifecycle

Lifecycle⽣命周期接⼝主要⽅法示意

image.png

Lifecycle⽣命周期接⼝继承体系示意

image.png
源码追踪部分我们关注两个流程:Tomcat启动流程和Tomcat请求处理流程

Tomcat启动流程

image.png重点使用模板方法模式

Tomcat请求处理流程

请求处理流程分析
image.png
请求处理流程示意图
image.png