IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 如何在Idea中调试最新版本的Tomcat10源代码 -> 正文阅读

[Java知识库]如何在Idea中调试最新版本的Tomcat10源代码

1. 下载源代码

可以到Tomcat官网下载源码压缩包,也可以去GitHub仓库Clone。

1.1 下载压缩包

前往网址Tomcat官网:Apache Tomcat? - Apache Tomcat 10 Software Downloads

image-20211126213011616

1.2 GitHub下载

仓库地址:apache/tomcat: Apache Tomcat (github.com)

如果想在代码中做一些注释,可以fork到自己的账号。执行如下命令,下载10.0.13版本:

git clone -b 10.0.13 https://github.com/apache/tomcat.git

2. 采用Maven方式构建

Tomcat默认采用的是Ant方式构建,官网中也对用其他方式做了提示:

重要提示:这不是构建 Tomcat 的支持方法; 此信息不提供任何保证:-)。 构建 Tomcat 的唯一支持方法是使用上述 Ant 构建。 但是,一些开发人员喜欢使用 Java IDE 处理 Java 代码。

为了方便调试,我们采用Maven方式在Idea中调试源码。

2.1 创建pom.xml文件

首先在下载的代码根目录创建一个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>tomcat10</artifactId>
  <version>10.0.13</version>
  <name>tomcat10</name>
  <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>4.3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant</artifactId>
      <version>1.10.12</version>
    </dependency>
    <dependency>
      <groupId>wsdl4j</groupId>
      <artifactId>wsdl4j</artifactId>
      <version>1.6.2</version>
    </dependency>
    <dependency>
      <groupId>javax.xml</groupId>
      <artifactId>jaxrpc-api</artifactId>
      <version>1.1</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jdt</groupId>
      <artifactId>org.eclipse.jdt.core</artifactId>
      <version>3.27.0</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jdt</groupId>
      <artifactId>ecj</artifactId>
      <version>3.27.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>jakartaee-migration</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>biz.aQute.bnd</groupId>
      <artifactId>biz.aQute.bndlib</artifactId>
      <version>6.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.unboundid</groupId>
      <artifactId>unboundid-ldapsdk</artifactId>
      <version>6.0.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>Tomcat10.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>3.6.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

右键点击代码文件夹,选择用Idea打开。或者再Idea中通过File->New->Project from Sources的方式打开代码文件夹:

image-20211126220051086

点击Maven的Reload按钮开始加载依赖:

image-20211126220334089

等待加载完成。

2.2 Build项目

点击Build按钮开始构建项目,会提示:“java: 程序包trailers不存在。”和“找不到符号 ResponseTrailers”,两个错误都出现在test文件夹。缺少的文件都在webapps/examples/WEB-INF/classes文件夹,

image-20211126221228788

拷贝文件夹“webapps/examples/WEB-INF/classes/trailers”到“test”文件夹下。

拷贝文件“webapps/examples/WEB-INF/classes/util/CookieFilter.java”到“test/util”文件夹下。

此时再次Build不再出错。

3. 排查启动问题

找到文件“java/org/apache/catalina/startup/Bootstrap.java”,其中的main方法是Tomcat的启动起点。

Run这个方法,启动Tomcat,默认地址为“http://localhost:8080/“。

3.1 端口被占用

默认会监听8080端口,如图提示被占用,可以去“conf/server.xml”文件中修改:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

3.2 提示Jsp相关的如下错误

image-20211126222825876

修改“java/org/apache/catalina/startup/ContextConfig.java”文件,在configureStart方法中添加一行代码,位置如下面所示:

    protected synchronized void configureStart() {
        // 此处省略一部分代码
        webConfig();
        // 添加下面一行代码
        context.addServletContainerInitializer(new JasperInitializer(), null);
        
        if (!context.getIgnoreAnnotations()) {
            applicationAnnotationsConfig();
        }

再次启动,可以看到熟悉的页面了。

image-20211126223816126

3.3 输出窗口提示找不到“XXXListener”

可以看到如下错误:

image-20211126223950431

和2.2中遇到的错误类似,对应的文件还是存在于“webapps/examples/WEB-INF/classes”文件夹中:

image-20211126224424252

而“webapps/examples/WEB-INF/web.xml”中对这几个Listener做了引用。

这个Webapps文件夹就是我们平时正常使用Tomcat的时候,用于放置网站的目录。里面现有的文件也是平时安装Tomcat之后存在的默认网站。出问题的原因是这个默认网站也是源代码状态,未编译,所以导致找不到对应的类。

如果下载Tomcat的安装文件(64-bit Windows zip),对比一下examples文件夹的内容,如下图,左侧为源代码目录,右侧为安装包中的文件目录,可以看到对右侧编译后的文件。

image-20211127202221250

处理这个问题,一种方案是删掉examples文件夹,但这个文件夹其实提供了我们用来调试的样例,想办法利用起来。将右侧的内容拷贝到左侧(文件夹复制,跳过存在的文件),再次运行,问题已解决。

4. 源代码调试

上文说到webapp里的examples文件夹即默认网站的examples菜单对应内容.

image-20211127204648173

examples提供了一些样例,正好可以用于调试Tomcat源码:

image-20211127204729272

例如我在CoyoteAdapter的service方法中添加了一个断点

image-20211127213830616

点击Hello World后面对应的Execute链接,断点被激活,一个请求的处理就这么开始了。可以根据自己的调试需求去添加断点调试了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:10:49  更:2021-11-29 16:11:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:31:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码