Tomcat目录结构解析;idea导入tomcat源码启动;tomcat源码学习
Tomcat的目录结构
目录 | 文件 | 描述 |
---|---|---|
bin | / | 存放Tomcat的启动、停止等批处理脚本文件 |
startup.bat, startup.sh | 用于在windows和linux下的启动脚本 | |
shutdown.bat, shutdown.sh | 用于在windows和linux下的停止脚本 | |
conf | / | Tomcat的配置文件和相关的 DTD |
Catalina | 存储针对每个虚拟机的Context配置 | |
context.xml | 用于定义所有web应用均需加载的Context配置,如果web应用指定了自己的context.xml,该文件将被覆盖 | |
catalina.properties | Tomcat 的环境变量配置 | |
catalina.policy | Tomcat 运行的安全策略配置 | |
logging.properties | Tomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等 | |
server.xml | Tomcat 服务器的核心配置文件 | |
tomcat-users.xml | 定义Tomcat默认的用户及角色映射信息配置 | |
web.xml | Tomcat 中所有应用默认的部署描述文件, 主要定义了基础Servlet和MIME映射 | |
lib | / | Tomcat 服务器的依赖包 |
logs | / | Tomcat 默认的日志存放目录 |
webapps | / | Tomcat 默认的Web应用部署目录 |
work | / | Web 应用JSP代码生成和编译的临时目录 |
Tomcat 启动 停止 访问
启动
windows启动
双击 bin/startup.bat 文件
linux启动
sh startup.sh
停止
windows停止
双击 bin/shutdown.bat 文件
linux停止
sh bin/startup.sh
访问
http://localhost:8080/
Tomcat源码下载,导入IDE启动
源码下载
为什么选择这个版本,因为这个版本是Java最后一个支持JDK1.8的版本
地址:https://tomcat.apache.org/download-10.cgi
源码下载:https://github.com/apache/tomcat
源码目录结构
为什么源码结构中时build.xml,没有pom.xml
Tomcat的依赖管理用到的是Ant技术进行管理的,所以只有build.xml
Ant技术基本已经被淘汰,如果要使用maven管理,就要自己创建pom.xml
创建pom.xml
寻找可用的pom.xml 太累人了,
起初想查询一下是否有build.xml 转换为pom.xml的工具,都失败了。
通过百度,爬楼最终找到Tomcat10.0.6版本的pom文件。既然都是tomcat10版本,应该差不多。
Tomcat10.0.6版本的pom:https://gitee.com/stefanpy/tomcat-source-code-learning
因本人学识浅薄,折腾时间过长,选择放弃自己创建pom文件,选择使用拿来主义。
准备使用apache-tomcat-8.5.42-src版本来学习Tomcat源码
apache-tomcat-8.5.42-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.42-src</artifactId>
<version>8.5</version>
<name>Tomcat8.5</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>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.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-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
<build>
<finalName>Tomcat8.5</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 导入项目Tomcat项目 步骤
-
解压源码包
-
创建一个目录,命名为catalina-home, 并将conf、webapps目录移入catalina-home目录中
-
创建一个 pom.xml 文件,引入tomcat的依赖包(可参考上面的pom)
-
配置idea的启动类, 配置 MainClass , 并配置 VM 参数。
VM 参数
-Dcatalina.home=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home
-Dcatalina.base=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home
-Djava.endorsed.dirs=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\endorsed
-Djava.io.tmpdir=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\conf\logging.properties
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Djdk.tls.ephemeralDHKeySize=2048
5. 编译启动
启动Tomcat过程中遇到的问题
idea java: -source 1.5 中不支持 diamond 运算符
idea java: -source 1.5 中不支持 diamond 运算符
(请使用 -source 7 或更高版本以启用 diamond 运算符)
点击上述图标或者 快捷键:Alt+Ctrl+Shift+S
改为高版本
TestCookieFilter报错:Error java: 找不到符号 符号: 变量 CookieFilter
我在webapps\examples\WEB-INF\classes\util 中找到CookieFilter.java
在java目录中创建一个包把该类移过去,在TestCookieFilter引入即可
org.apache.jasper.JasperException: java.lang.NullPointerException 无法编译
直接启动org.apache.catalina.startup.Bootstrap的时候没有加载JasperInitializer,从而无法编译JSP。解决办法是在tomcat的源码ContextConfig中的configureStart函数中手动将JSP解析器初始化
context.addServletContainerInitializer(new JasperInitializer(), null);
启动成功
总结
讲tomcat在idea中启动起来真的不容易。
整个过程爬贴无数,历史一天终见成效。
困难重重,忘君莫要放弃。加油!!!