tomcat源码编译步骤

本文介绍了Tomcat作为一款开源的Servlet容器,特别是从8.5版本开始的新特性,如支持Servlet 4.0预览API、NIO2、HTTP/2协议等。此外,还详细阐述了Tomcat 9.0.41的编译步骤,包括下载源码、配置目录、添加依赖和解决编译过程中遇到的日志乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tomcat介绍

Tomcat是基于java语言的轻量级应用服务器,是一款完全开源免费的Servlet容器实现。支持HTML,JS等静态的处理。

tomcat8.5之后的新特性

  1. 自8.0版本开始,Tomcat支持Servlet3.1、JSP3.0、EL3.0、Websocket1.1;并且9.0版本支持Servlet4.0

  2. 为了让用户提前体验Servlet4.0的新特性,在8.5版本中,Tomcat提供了一套Servlet4.0预览API

  3. 自8.0版本开始,默认的HTTP、AJP链接器采用NIO,而非Tomcat7以前版本的BIO;并且在8.5开始,Tomcat移除BIO的支持

  4. 在8.0版本中,Tomcat提供了一套全新的资源实现,采用单独,一致的方法配置web应用的附加资源,以替代原有的Aliases,VirtualLoader,VirtualDirContext,JAR。新的资源方案可以用于实现覆盖。例如可以将一个WAR作为多个Web应用基础,同时这些Web应用各自拥有自己的定制功能

  5. 自8.0版本开始,链接器新增支持JDK7的NIO2,和HTTP/2协议

  6. 默认采用异步日志处理方式

    除了新增的功能外,Tomcat8.5之后也进行了大量的代码重构。

Tomcat编译

本文编译采用了Tomcat 9.0.41版本

1. Tomcat官网下载源码包
tomcat官网:https://tomcat.apache.org/

2. 新建Catalina-home目录,把conf和webapps文件

3. 解压,在tomcat源码包下新建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>tomcat9</artifactId>
    <name>tomcat9</name>
    <version>9.0.41</version>
    <build>
        <finalName>tomcat10</finalName>
        <sourceDirectory>java</sourceDirectory>
        <!--<testSourceDirectory>test</testSourceDirectory>  test 下的有些文件报错,因此将test文件夹去掉了-->
        <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>3.5.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.10.7</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>4.2</version>
        </dependency>

        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.3</version>
        </dependency>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jdt</groupId>
            <artifactId>org.eclipse.jdt.core</artifactId>
            <version>3.13.0</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/biz.aQute.bnd/biz.aQute.bnd.annotation -->
        <dependency>
            <groupId>biz.aQute.bnd</groupId>
            <artifactId>biz.aQute.bnd.annotation</artifactId>
            <version>3.3.0</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
</project>

以上是Tomcat编译时需要的依赖包,可以根据build.properties.default文件下找到编译时需要的依赖包

注:tomcat9以上需要注释掉aQute.bnd.annotation.spi.ServiceConsumer,找不到这个包,本人没有找到

4. 设置JVM参数,本人用的idea工具

-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.longging.config.file=E:/ideaWrokspace/apache-tomcat-9.0.41-src/apache-tomcat-9.0.41-src/catalina-home/conf/logging.properties
-Dfile.encoding=UTF-8
-Dsun.jun.encoding=UTF-8

启动出现的问题

(1)日志乱码
(2)java.lang.ClassNotFoundException: listeners.ContextListener
(3)java.lang.ClassNotFoundException: listeners.SessionListener
(4)java.lang.ClassNotFoundException: async.AsyncStockContextListener
(5)java.lang.ClassNotFoundException: websocket.drawboard.DrawboardContextListener
(6)org.apache.jasper.JasperException: org.apache.jasper.JasperException

问题一,日志乱码解决:

  1. jvm参数:
    -Dfile.encoding=UTF-8
    -Dsun.jun.encoding=UTF-8
  2. 修改run/debug configurations 添加Environment variables参数:JAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8和-Dsun.jun.encoding=UTF-8
  3. 修改idea配置file encoding的第三处为UTF-8
  4. 修改idea的Custom VM options。添加-Dfile.encoding=UTF-8
  5. 修改idea安装目录下的idea.exe.vmoptions和idea64.exe.vmoptions文件,添加-Dfile.encoding=UTF-8
  6. 修改idea文件夹下的encodings.xml文件,不是UFT-8的修改为UTF-8
  7. 修改Tomcat的配置文件logging.properties,将GBK改为UTF-8

若以上方法没有用,日志显示是如一下:
在这里插入图片描述
并不是日志输出的value乱码,而是key乱码,则需要修改代码。日志上显示VersionLoggerListener,TldScanner.scanJars等打印key值乱码。实际上是读取国际化的时候,LocalString_zh_CN.properties文件的key值乱码。因为用的是ISO-8859-1,而中文是UTF-8
所以需要转化,debug下在StringManager.getString(String key),以及Localizer.getMessage(String errCode)加上

try {
        str = new String(str.getBytes("ISO-8859-1"),"UTF-8");
    }catch (Exception e){
        e.printStackTrace();
    }

问题2-5可以忽略,主要是一些监听器为空,不影响Tomcat运行
问题六,org.apache.jasper.JasperException解决:
需要添加jsper初始化解析器。在ContextConfig类中986行

context.addServletContainerInitializer(new JasperInitializer(),null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值