tomcat构建源码环境

一. IDEA运行Tomcat8源码

参考网址:https://blog.csdn.net/yekong1225/article/details/81000446

​ Tomcat作为J2EE的开源实现,其代码具有很高的参考价值,我们可以从中汲取很多的知识。作为Java后端程序员,相信有很多人很想了解Tomcat的运行原理。Tomcat的构建是基于Ant和Eclipse的,然而现在很多人都喜欢IDEA+Maven的项目构建方式,本文描述了在Win7的环境下,使用IDEA导入Tomcat 8.0.53源码,并运行tomcat源码。

1、准备工作

安装和下载这些软件包就可以开始搭建调试环境了。

2、项目结构

  • 将下载下来的apache-tomcat-8.0.53-src.zip解压,然后在解压后的apache-tomcat-8.0.53-src目录中新建catalina-home目录和pom.xml文件
  • apache-tomcat-8.0.53-src目录中的conf和webapps文件夹复制到catalina-home目录中

pom文件内容如下

html 复制代码
<?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.0</artifactId>
    <name>Tomcat8.0</name>
    <version>8.0</version>
 
    <build>
        <finalName>Tomcat8.0</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>

catalina-home目录结构如下

lib文件夹是空的

至此基本的准备工作已经完成了

3、构建项目

  1. 将apache-tomcat-8.0.53-src项目导入进IDEA中

  2. 配置启动参数

Main class设置为org.apache.catalina.startup.Bootstrap

添加VM options

shell 复制代码
-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

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

4、启动项目

上面第三步已经构建了项目的运行环境,点击运行或者调试按钮后,正常运行。

项目启动完毕我们可以测试了,在浏览器访问http://localhost:8080/ 发现打不开我们看到的经典欢迎页面了,页面报了一个错

原因是我们直接启动org.apache.catalina.startup.Bootstrap的时候没有加载org.apache.jasper.servlet.JasperInitializer,从而无法编译JSP。解决办法是在tomcat的源码org.apache.catalina.startup.ContextConfig中手动将JSP解析器初始化:

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

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

二. 启动乱码问题解决

参考网址:https://www.jianshu.com/p/24483c3fc58c

日志级别中文提示正常 后面乱码 如图

解决方案:

1、可以采用英文输出 只需要配置启动参数即可

2、确认项目编码都设置为UTF-8后,在StringManager.java:134行后,增加一行代码:

​ str = new String(str.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

修改后日志信息输出正常 但是前段调用后中文也可能是乱码

解决方案 此时还要改一个文件,否则页面报错信息为乱码;

Localizer类的getMessage(String errCode)方法也得加:

end

三.导入web项目到tomcat源码

相比较上而言,只需要修改下面的

相关推荐
直视太阳34 分钟前
springboot+easyexcel实现下载excels模板下拉选择
java·spring boot·后端
Code成立40 分钟前
《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2章 Java内存区域与内存溢出异常
java·jvm·jvm内存模型·jvm内存区域
一 乐1 小时前
实验室预约|实验室预约小程序|基于Java+vue微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·毕业设计·论文·实验室预约小程序
程序媛学姐1 小时前
SpringRabbitMQ消息模型:交换机类型与绑定关系
java·开发语言·spring
努力努力再努力wz1 小时前
【c++深入系列】:类与对象详解(中)
java·c语言·开发语言·c++·redis
兰亭序咖啡1 小时前
学透Spring Boot — 009. Spring Boot的四种 Http 客户端
java·spring boot·后端
独行soc1 小时前
2025年渗透测试面试题总结- 某四字大厂面试复盘扩展 一面(题目+回答)
java·数据库·python·安全·面试·职场和发展·汽车
早上好啊! 树哥1 小时前
常见的文件加密方式之【异或加密】,代入原理看例子,帮助更好的理解。
android·java·junit
兰亭序咖啡2 小时前
学透Spring Boot — 018. 优雅支持多种响应格式
java·spring boot·后端
小雨凉如水2 小时前
docker 常用命令
java·docker·eureka