首页 > 编程语言 >【Tomcat】【源码一】Tomcat 源码分析环境搭建

【Tomcat】【源码一】Tomcat 源码分析环境搭建

时间:2023-09-14 09:03:21浏览次数:58  
标签:Java Tomcat tomcat 源码 apache org 搭建

1  前言

Apache Tomcat®软件是Java Servlet、JavaServer页面、Java 语言表达式和 Java WebSocket 技术的开源实现。Java Servlet、JavaServer页面、Java 表达式语言和 Java WebSocket 规范都是在 Java 社区进程下开发的。

Apache Tomcat 软件是在开放和参与的环境中开发的,并在 Apache 许可版本 2 下发布。Apache Tomcat 项目旨在成为世界各地最优秀的开发人员的协作项目。我们邀请您参与这个开放的开发项目。要了解更多关于参与的信息,请点击这里。

Apache Tomcat 做为标准的 Java Servlet 规范的标准实现。在 Java 企业级开发中,很多企业都是基于 Tomcat 来发布应用,尤其是 Spring Boot 默认内置 Tomcat 做为 Servlet 容器。我们有必要去学习 Tomcat 源码,这样我们可以更好的使用并且优化 Tomat。

参考:https://blog.csdn.net/u012410733/article/details/105544643

2  下载 Tomcat 源码

8、9、10版本的下载:https://tomcat.apache.org/ 

6以及以前的版本下载:https://archive.apache.org/dist/tomcat/tomcat-6/ (jdk不能大于8,否则不兼容)

由于博主使用的是 Mac 操作系统所以下载的是 tar.gz 格式的文件。如果使用 window 操作系统,可以下载 zip 格式的文件.

解析源码压缩包,可以得到源码项目 apache-tomcat-8.5.54-src 。

3  添加 pom.xml

Tomcat 的依赖管理是使用的 ant,但是现在企业基本上都使用 maven 进行项目的依赖管理。

进入apache-tomcat-8.5.54-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.53-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>

4  创建配置文件 source

Tomcat 本身就是 Java 开发邮的一款软件。我们在直接使用 Tomcat 的时候,Tomcat 需要读取 server.xml 以及其它配置文件,同时还需要找到它要去部署的工程项目。使用源码方式,依赖是如此的。

所以我们在启动源码进行调试时,需要在通过指定虚拟机参数把项目配置文件传递进去。

将 apache-tomcat-8.5.54-src 目录下的 conf 和 webapps 目录移动到刚刚创建的 source 目录当中。

5  Idea 导入 Tomcat 源码

下面就需要把 Tomcat 源码导入到 Idea 当中。

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

6  启动 Tomcat

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

-Dcatalina.home=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source
-Dcatalina.base=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source/conf/logging.properties

windows的:

-Dcatalina.home=D:\JetBrains\yanjiu\apache-tomcat-8.5.93-src\source
-Dcatalina.base=D:\JetBrains\yanjiu\apache-tomcat-8.5.93-src\source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\JetBrains\yanjiu\apache-tomcat-8.5.93-src\source\conf\logging.properties

7  Q & A

7.1  控制台乱码

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

所以在处理 Tomcat 启动乱码时需要修改以下两点:

第一个修改点

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

# @位置:org.apache.tomcat.util.res.StringManager
# @方法 getString()
# @Line:130行
str = bundle.getString(key)
替换成下面代码:
str = new String(bundle.getString(key).getBytes("ISO-8859-1"), "UTF8");

第二个修改点:

org.apache.jasper.servlet.TldScanner#scanJars

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);

以下就是修改代码后的控制台打印日志:

7.2  访问 Tomcat 500

当启动 Tomcat 成功之后访问 localhost:8080时,会出现 500 异常。

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

ContextConfig#configureStart

 // 读取 Web 项目配置 (web.xml 配置)
 webConfig();


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

然后就可以正常访问了。

7.3  访问 Tomcat 提供的 Examples 报 404

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

会报 404 异常:

解决办法:
${tomcat.project}/source/webapps/examples/WEB-INF/classes 右击 Mark Directory as sources Root

标记之后图标会从灰色变成蓝色,接着就重启 Tomcat 源码。然后就可以正常的访问 localhost:8080/examples

8  小结

一步一步走下来,我的是可以启动成功的,6以及之前的版本需要的 JDK是7 ,高版本的不兼容奥,我是整了两个一个8版本、一个6版本 对比着看,也感谢博主哈。

标签:Java,Tomcat,tomcat,源码,apache,org,搭建
From: https://www.cnblogs.com/kukuxjx/p/17701288.html

相关文章

  • tomcat报错:java.io.IOException: 您的主机中的软件中止了一个已建立的连接。页面响应
    tomcat报错:java.io.IOException:您的主机中的软件中止了一个已建立的连接。tomcat报错:org.apache.catalina.connector.ClientAbortException:java.io.IOException:您的主机中的软件中止了一个已建立的连接。 出现原因:1、由于客户端在发送请求后,还没等服务器响应就断开了......
  • MySQL+MHA搭建&&性能优化
    MHA基础概念MHAMHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上......
  • windows环境下tomcat配置一些问题记录
    首先我们需要提前在电脑上安装jdk官网如下:JavaArchiveDownloads-JavaSE11|Oracle中国这里我安装的是jdk11 接着下载好tomcat安装包官网如下:ApacheTomcat®-Welcome!我下载的是9.0版本 复制安装路径配置环境变量对path进行修改 tomcat安装成功之后......
  • 基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型
    续基于开源模型的实时人脸识别系统进行人脸识别首要的任务就是要定位出画面中的人脸,这个任务就是人脸检测。人脸检测总体上算是目标检测的一个特殊情况,但也有自身的特点,比如角度多变,表情多变,可能存在各类遮挡。早期传统的方法有HaarCascade、HOG等,基本做法就是特征描述子+滑窗+......
  • java课堂开学第一节课测试源码
    1//2//Sourcecoderecreatedfroma.classfilebyIntelliJIDEA3//(poweredbyFernFlowerdecompiler)4//56importjava.io.PrintStream;7importjava.util.ArrayList;8importjava.util.Scanner;910publicclasstest{11......
  • 自助点餐管理系统的设计与实现-计算机毕业设计源码+LW文档
    1. 选题目的、意义及研究现状:1.1目的现代科学技术在快速发展、计算机与全球互连网络相连接,使今天的社会进入了以计算机为核心的社会。计算机的出现给我们诸多方面带来了无限的商机与便利。比如餐饮业,网络就发挥了巨大的作用——网上自助点餐。自助点餐为客户提供的是最方便的饮食......
  • 旅游景区景点系统的设计与实现-计算机毕业设计源码+LW文档
    选题意义: 旅游业经过多年的发展,已经从单一的观光旅游发展到目前的一站式旅游方向,呈现多元化趋势,为游客提供旅游观光、户外探险、自由行、住宿等各种服务。旅游业是一个国家综合性服务行业,可以为经济发展提供助力。对于大众来说,通过旅游可以提高生活质量,帮助人们更加有效的完成工......
  • 基于Django的社区疫情管理平台的设计与实现-计算机毕业设计源码+LW文档
    一、研究的背景和意义研究背景:2020年初,新冠疫情在武汉爆发,造成多人感染,社会治安和医疗体系面临巨大挑战。在这前所未有的严峻形式中,国家领导统一指挥,全面部署,积极应对挑战。社区是最小单位,社区防控做好才能取得关键性胜利。在没有经验基础的情况下,各社区除了执行政策条例外,积极摸......
  • 企业执勤管理系统的设计与实现-计算机毕业设计源码+LW文档
    摘 要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工劳动的弊端。企业一直以来都非常重视公司信息化的发展,近几年来随着公司规模扩大,业务逐渐增加,企业对员工的管理也愈发的困难。因此,公司提出通过开发基于Idea的企业执......
  • CentOS7安装Tomcat9并设置开机启动
    1.配置tomcat开机启动创建服务名xxxxxx.service文件,编辑之后保存即可cd/usr/lib/systemd/systemvixxxxxx.service插入以下内容[Unit]Description=TomcatAfter=syslog.targetnetwork.targetremote-fs.targetnss-lookup.target[Service]Type=oneshotExecSt......