zoukankan      html  css  js  c++  java
  • Tomcat源码分析(下载、启动)

     

    1.下载Tomcat源代码:

    https://tomcat.apache.org/download-80.cgi

     

    2. 解压以及创建必要目录和配置

    解压、新建catalina-home目录,同时将目录中的confwebapps文件夹复制到catalina-home目录中

     

    需要通过Maven组织文件,因此需要在根目录下创建目录中新建pom.xml文件

    <?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>Tomcat8.5</artifactId>

        <name>Tomcat8.5</name>

        <version>8.5</version>

        <build>

            <finalName>Tomcat8.5</finalName>

            <sourceDirectory>java</sourceDirectory>

            <testSourceDirectory>test</testSourceDirectory>

            <resources>

                <resource>

                    <directory>java</directory>

                </resource>

            </resources>

            <testResources>

               <testResource>

                    <directory>test</directory>

               </testResource>

            </testResources>

            <plugins>

                <plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-compiler-plugin</artifactId>

                    <version>2.3</version>

                    <configuration>

                        <encoding>UTF-8</encoding>

                        <source>1.8</source>

                        <target>1.8</target>

                    </configuration>

                </plugin>

            </plugins>

        </build>

        <dependencies>

            <dependency>

                <groupId>junit</groupId>

                <artifactId>junit</artifactId>

                <version>4.12</version>

                <scope>test</scope>

            </dependency>

            <dependency>

                <groupId>org.easymock</groupId>

                <artifactId>easymock</artifactId>

                <version>3.4</version>

            </dependency>

            <dependency>

                <groupId>ant</groupId>

                <artifactId>ant</artifactId>

                <version>1.7.0</version>

            </dependency>

            <dependency>

                <groupId>wsdl4j</groupId>

                <artifactId>wsdl4j</artifactId>

                <version>1.6.2</version>

            </dependency>

            <dependency>

                <groupId>javax.xml</groupId>

                <artifactId>jaxrpc</artifactId>

                <version>1.1</version>

            </dependency>

            <dependency>

                <groupId>org.eclipse.jdt.core.compiler</groupId>

                <artifactId>ecj</artifactId>

                <version>4.5.1</version>

            </dependency>

           

        </dependencies>

    </project>

    3. 配置IDEA运行项目

    通过pom.xml文件构建一个新的工程

     

    如果编译build的时候出现Test测试代码报错,注释该代码即可。Tomcat源码util.TestCookieFilter类会报错,将其注释即可

     

    Tomcat启动的目录为一个main方法类:org.apache.catalina.startup.Bootstrap

     

    添加VM options

    -Dcatalina.home=catalina-home

    -Dcatalina.base=catalina-home

    -Djava.endorsed.dirs=catalina-home/endorsed

    -Djava.io.tmpdir=catalina-home/temp

    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

    -Djava.util.logging.config.file=catalina-home/conf/logging.properties

     

    运行项目,访问http://localhost:8080,得到结果:

     

    原因是我们直接启动org.apache.catalina.startup.Bootstrap的时候没有加载org.apache.jasper.servlet.JasperInitializer,从而无法编译JSP

    解决办法是在tomcat的源码org.apache.catalina.startup.ContextConfig中的configureStart函数中手动将JSP解析器初始化:

    添加代码:context.addServletContainerInitializer(new JasperInitializer(), null);

    添加位置如下图:

     

    修改完后,项目再启动,我们再在浏览器访问http://localhost:8080/ ,就可以看到我们所熟悉的经典欢迎页面了

    Tomcat启动流程分析

    组件的生命周期管理

    用Lifecycle管理启动、停止、关闭

    Lifecycle接口预览

    几个核心方法

    Server中的init方法示例

    为啥StandardServer没有init方法

    LifecycleBase中的init与initInternal方法

    为什么这么设计?

    分析Tomcat请求过程

    链接器(Connector)与容器(Container)

    解耦

    Connector设计

    监听服务端口,读取来自客户端的请求

    将请求数据按照指定协议进行解析

    根据请求地址匹配正确的容器进行处理

    将响应返回客户端

    Container设计

    Servlet容器的实现。

    Servlet的请求和响应如何在容器中流转呢?

    管道模式

    管道与阀门

    管道是就像一条管道把多个对象连接起来,整体看起来就像若干个阀门嵌套在管道中,而处理逻辑放在阀门上。

    Tomcat中的管道

  • 相关阅读:
    eclipse新建JSP页面报错:Multiple annotations found at this line解决方法
    yum 安装报错:*epel: mirrors.aliyun.comError: xzcompressionnot available
    shell脚本中定义路径变量出现的BUG
    Rsync 12种故障排查及思路
    定时清除 /var/log/massage 下的信息脚本文件
    企业集群架构之全网备份
    局域网的某个机器无法上网,的排错思路
    日志审计
    在VUE中使用富文本编辑器ueditor
    ABP框架使用 Swagger
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/11223604.html
Copyright © 2011-2022 走看看