Tomcat 第一篇:源码导入 IDEA 编辑器

1 引言
做 Java 的同学应该都见过上面这只名字叫 Tomcat 的猫,毕竟这只猫在过去和现在都是全球最流行的 Web 容器之一。
很有意思的一件事儿是从我接触这只猫开始,从来不知道它的中文名字是啥,好像没有在任何地方看到过。
然后某人第一次见跟我说这是汤姆猫么???

我就没想通,这俩玩意长这么大差距是如何能被认成是同一只猫的。
不过话说回来,这东西我也接触了有很多年了,从来都只是拿来用,忽然有想法深入了解下 Tomcat 的运行机制了。
那么最好的方式就是看源码,如果说看源码不知道从哪看齐,还可以看官方的指引文档。
2 下载源码
Tomcat 的源码下载要比上周下载那个 OpenJDK 的源码好下载多了,官网直接给出了打好的源码包,同时在 GitHub 上也能找到对应的仓库。
这里我选择的是当前最新的 8.5.x 的版本。
官网下载地址:https://tomcat.apache.org/download-80.cgi

GitHub 地址:https://github.com/apache/tomcat

如果从 GitHub 下载还可以使用命令:
git clone git@github.com:apache/tomcat.git
源码下载完成后直接解压,接下来我们把这个项目导入我们的编辑工具 IDEA 中。
3 导入 IDEA
我在网上看了下,大致有两种方案导入。
由于本身 Tomcat 项目是使用 Ant 作为包管理工具的,而 Ant 我没有接触过,也不大熟悉,这个方案我直接放弃掉了。
接下来还有一个方案是使用 Maven 的方式进行导入,这个我熟悉,天天用。
因为是 Maven 工程,那么一定需要一个 pom.xml 文件,首先在项目的根目录下创建这个文件,并且 copy 以下内容:
<?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</groupId>
<artifactId>tomcat</artifactId>
<name>apache-tomcat-8.5.57</name>
<version>8.5.57</version>
<build>
<finalName>Tomcat-8.5.57</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.5.1</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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.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.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish/javax.xml.rpc -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.xml.rpc</artifactId>
<version>3.0.1-b03</version>
</dependency>
</dependencies>
</project>
然后在 IDEA 中点击 File -> New -> Project from Existing Sources... 选择我们刚才解压后的文件夹。

选择 Maven 项目,点击 Finish 直接完成。
4 启动 Tomcat
接下来的事儿就好办多了,首先选择当前的 jdk 版本,我这里使用的是 OracleJDK 1.8.0_221 ,最好是使用 1.8 的版本,因为我尝试过最新的 OpenJDK14 直接通不过编译(说好的向下兼容呢)。
Tomcat 的启动类是 org.apache.catalina.startup.Bootstrap ,直接运行这个类里面的 main 方法就可以启动了。
当然,如果就这么单纯的运行这个类还是会启动报错的,还需要下面几步操作。
首先需要删除一个测试类
test/util/TestCookieFilter.java。然后还需要配置启动参数:
-Dcatalina.home=D:/Development/Projects/Tomcat-Learning/apache-tomcat-8.5.57-src
-Dcatalina.baseD:/Development/Projects/Tomcat-Learning/apache-tomcat-8.5.57-src
-Djava.endorsed.dirs=D:/Development/Projects/Tomcat-Learning/apache-tomcat-8.5.57-src/endorsed
-Djava.io.tmpdir=D:/Development/Projects/Tomcat-Learning/apache-tomcat-8.5.57-src/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:/Development/Projects/Tomcat-Learning/apache-tomcat-8.5.57-src/conf/logging.properties
-Duser.language=en
-Duser.region=US

最后这两个参数是指定了语言环境,如果不配置的话在控制台的日志打印会直接乱码,虽然不影响使用,但是影响到我们观察日志了,最好还是做一下配置。
- 添加 jsp 初始化程序
在 org.apache.catalina.startup.ContextConfig.java 中添加下面这句话:
context.addServletContainerInitializer(new JasperInitializer(), null);
如果不添加的话,启动是能正常启动,但是 Tomcat 的欢迎页就看不到了,会直接报 jsp 解析器空指针:
org.apache.jasper.JasperException: java.lang.NullPointerException
到这里,已经可以运行上面的 org.apache.catalina.startup.Bootstrap 里面的 main 进行启动了,启动完成后在浏览器上输入 http://localhost:8080/ 就可以看到那个经典的 Tomcat 的欢迎页了:

- 部署程序
如果想在这个 Tomcat 中部署程序的话,需要把程序放在 D:\Development\Projects\Tomcat-Learning\apache-tomcat-8.5.57-src\webapps\ROOT ,这个是我自己本地的路径,你们的路径自己做拼接。
然后再在 D:\Development\Projects\Tomcat-Learning\apache-tomcat-8.5.57-src\conf 这个路径中的 server.xml 配置工程,就和在 Tomcat 中配置 server.xml 是一模一样的,比如:
在 Host 中增加节点
<Context docBase="D:\Development\Projects\Tomcat-Learning\apache-tomcat-8.5.57-src\webapps\ROOT" path="/mytomcat" reloadable="true"/>
哎,我又是开了新系列的头,希望最近能有时间把这个系列写完吧。
Tomcat 第一篇:源码导入 IDEA 编辑器的更多相关文章
- Tomcat源码导入eclipse的步骤
Tomcat源码导入eclipse 一.下载源码 1. 进入Apache 官网:http://tomcat.apache.org/ 2. 在左边侧选择要下载的源码的版本. 3. 或者直接通过Ar ...
- Tomcat源码导入Eclipse测试
想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...
- tomcat源码导入eclipse步骤
1. 获取源代码 方式一:从官网http://tomcat.apache.org/download-70.cgi 直接下载,官网提供了Binary 和 Source Code两种下载方式,要研究tom ...
- tomcat源码导入eclipse
1. 获取源代码 方式一:从官网http://tomcat.apache.org/download-70.cgi 直接下载,官网提供了Binary 和 Source Code两种下载方式,要研究tom ...
- 如何将spring源码导入到eclipse中
如何将spring源码导入到eclipse中 1. 下载spring源码 可以在github官网中找到spring源码来下载,或者直接通过git下载,是一样的,这里演示 直接在github网站下载, ...
- 将Android系统源码导入ecplise
Android系统源码中带有个IDE的配置文件,目录为:development/ide/ 如果要用eclipse导入查看系统源码,则将development/ide/eclipse/.classpat ...
- spring4.0源码导入
一个面试,让我知道了自己的不足,一天不进步就是倒退. spring源码导入eclipse 本人的环境 (我导入的是最新的spring 4.0 所以要用jdk1.8) 1 安装git (mac上自带了g ...
- spring源码解析——spring源码导入eclipse
一.前言 众所周知,spring的强大之处.几乎所有的企业级开发中,都使用了spring了.在日常的开发中,我们是否只知道spring的配置,以及简单的使用场景.对其实现的代码没有进行深入的了 ...
- 将struts源码导入eclipse
预制条件和spring源码导入eclipse中一样,下面直接给出导入eclipse的步骤. 步骤: 1. 下载struts相应版本的源码 http://struts.apache.org/downlo ...
随机推荐
- Mybatis 循环删除/插入
<foreach collection="array" open="(" separator="," close=")&qu ...
- golang目录
基础 golang安装及vscode编辑器配置 golang基础结构 golang基础数据类型 golang复合数据结构 goalng函数 golang方法 golang接口 golang并发 gol ...
- 月历输出php代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- pandas 数据库数据的读取
绝大多数公司都会选择将数据存入数据库中,因为数据库既可以存放海量数据,又可以非常便捷地实现数据的查询.下面以MySQL和SQL Server为例,来练习Pandas模块和 对应的数据库模块. 首先需要 ...
- Java程序员值得拥有的TreeMap指南
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...
- 产品经理培训教程视频大全与模板Axure rp9与8视频教程元件库模板
注意:请仔细阅读购买,一旦发货百度网盘链接不能退~ 自动发邮件到买家留言处的邮箱,或注册淘宝时的邮箱自动通过旺旺给您发货还可以访问网页提取链接自助提取(复制到浏览器): http://4k5.cn/V ...
- Markdown - Typora 10分钟入门 - 精简归纳
Markdown - Typora 10分钟入门 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 22 转载请注明出处! 目录 Markdown - Typora 10分钟入门 - 精简归纳 ...
- ASP.NET Core 3.1 WebAPI的跨域问题
1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...
- javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...
- 手写@Service、@Autowired、@Transactional注解,实现spring ioc和spring事务
自定义@Service注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Custom ...