Apache Tomcat 源码分析环境搭建

17 篇文章 0 订阅
官网下载

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

在这里插入图片描述

这里下载apache-tomcat-8.5.50-src可以选择其它版本

添加 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>apache-tomcat-8.5.50-src</artifactId>
    <name>Tomcat8.5</name>
    <version>8.5</version>

    <build>
        <!--指定源目录-->
        <finalName>Tomcat8.5</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.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!--Tomcat是java开发的,封装了很多功能,它需要依赖一些基础的jar包-->
    <dependencies>
        <!--远程过程调用工具包-->
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>
        <!--soap协议处理工具包-->
        <dependency>
            <groupId>javax.xml.soap</groupId>
            <artifactId>javax.xml.soap-api</artifactId>
            <version>1.4.0</version>
        </dependency>
        <!--解析webservice的wsdl文件工具-->
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!--Eclipse Java编译器-->
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
        <!--ant管理工具-->
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
        </dependency>
        <!---easymock辅助单元测试-->
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>
</project>

创建配置文件 source

omcat 本身就是 Java 开发邮的一款软件。我们在直接使用 Tomcat 的时候,Tomcat 需要读取 server.xml 以及其它配置文件,同时还需要找到它要去部署的工程项目。使用源码方式,依赖是如此的
在这里插入图片描述
所以我们在启动源码进行调试时,需要在通过指定虚拟机参数把项目配置文件传递进去。

将 apache-tomcat-8.5.50-src 目录下的 conf 和 webapps 目录移动到刚刚创建的 source 目录当中
在这里插入图片描述
在这里插入图片描述

导入idea

在这里插入图片描述
开始导入的时候,pom.xml 中依赖的有些 Jar 包还没有下载,就会出现依赖问题。就需要执行 mvn clean install 编译下载 pom.xml 中依赖的 Jar 包

启动 Tomcat

在这里插入图片描述

Tomcat 的入口类是 org.apache.catalina.startup.Bootstrap ,接着就是启动这个入口类。当然为了正常启动还需要添加以下启动参数。

-Dcatalina.home=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source
-Dcatalina.base=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:/sources/apache-tomcat-8.5.50-src/apache-tomcat-8.5.50-src/source/conf/logging.properties

路径需要自己修改

控制台乱码

Tomcat 里面是实现了 i18n 也就是国际化的,所以在启动的时候会出现乱码问题。虽然 Tomcat 的中文国际化文件的编码格式是 utf-8,但是 Java 国际化 ResourceBundle 在读取的时候默认使用的是 ISO-8859-1而且处理类还不能够传入编码。
在这里插入图片描述

  • 1,修改 org.apache.tomcat.util.res.StringManager

在这里插入图片描述

 public String getString(String key) {
        if (key == null){
            String msg = "key may not have a null value";
            throw new IllegalArgumentException(msg);
        }

        String str = null;

        try {
            // Avoid NPE if bundle is null and treat it like an MRE
            if (bundle != null) {
                str = bundle.getString(key);
            }
        } catch (MissingResourceException mre) {
  • 修改为
# @位置:org.apache.tomcat.util.res.StringManager
# @方法 getString()
# @Line:130行左右
str = bundle.getString(key)
替换成下面代码:
str = new String(bundle.getString(key).getBytes("ISO-8859-1"), "UTF8");

在这里插入图片描述

  • 2.org.apache.jasper.servlet.TldScanner

在这里插入图片描述

log.info(Localizer.getMessage("jsp.tldCache.noTldSummary"));
替换成下面代码:
String message = Localizer.getMessage("jsp.tldCache.noTldSummary");
String logger = new String(message.getBytes("ISO-8859-1"), "UTF8");
log.info(logger);

在这里插入图片描述

  • 再次启动
    在这里插入图片描述
访问http://localhost:8080/ -500错误

在这里插入图片描述

原因是 Tomcat 源码中 JSP 引擎 jasper 没有被初始化,从而无法编译处理 JSP(因为 JSP 是需要被转换成 Servlet 进一步编译处理的)。我们只需要在 Tomcat 的源码 ContextConfig 类中的 configureStart 方法中增加一行代码将 JSP 引擎初始化,如下:

  • org.apache.catalina.startup.ContextConfig
    org.apache.catalina.startup.ContextConfig#configureStart

    protected synchronized void configureStart() {
        // Called from StandardContext.start()

        if (log.isDebugEnabled()) {
            log.debug(sm.getString("contextConfig.start"));
        }

        if (log.isDebugEnabled()) {
            log.debug(sm.getString("contextConfig.xmlSettings",
                    context.getName(),
                    Boolean.valueOf(context.getXmlValidation()),
                    Boolean.valueOf(context.getXmlNamespaceAware())));
        }

        webConfig();
        // 初始化 jsp 引擎 (下面是添加的代码) 增加这一行
        context.addServletContainerInitializer(new JasperInitializer(), null);

在这里插入图片描述

  • 再启动
    在这里插入图片描述

访问 ${tomcat.project}/source/webapps/examples 提供的 Examples 。

在这里插入图片描述

在这里插入图片描述

  • 解决办法:
    ${tomcat.project}/source/webapps/examples/WEB-INF/classes 右击 Mark Directory as sources Root。
    在这里插入图片描述

在这里插入图片描述
标记之后图标会从灰色变成蓝色,接着就重启 Tomcat 源码

  • 重启

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值