使用嵌入式 Tomcat 创建Java Web应用程序
可以直接去Github仓库中拉取项目
前提
- JDK:1.8
- Tomcat:9.0.82
教程
第一步:引入 Maven 依赖
我们需要在 pom.xml 中引入核心运行库、JSP 解析支持,以及日志桥接工具。日志对于观察 Lifecycle 状态切换和 Connector 的接收流程至关重要。
注意:你可能会观察到对于javax.servlet我们定义的是provided,这是因为Web应用中的lib目录下
不应该出现Servlet API或者Tomcat自身的JAR,这些JAR由我们内嵌的Tomcat负责提供。所以在
Maven构建应用时,对Servlet API的依赖应该指定为<scope>provided</scope>
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>com.puyu.study</groupId>
<artifactId>devcenter-embedded-tomcat</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tomcat.version>9.0.82</tomcat.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
第二步:编写启动类
2.1:创建目录结构
text
devcenter-embedded-tomcat
├── src
│ ├── main
│ │ ├── java # 放置你的 Java 代码
│ │ ├── resources # 放置 logback.xml
│ │ └── webapp # 放置 index.html (作为 Web 根目录)
│ └── test
└── pom.xml
2.2:编写启动类 Main
在src/main/java下创建com.perry.tomcat包
在该包下创建 TomcatLauncher.java 类:
java
package com.perry.tomcat;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.slf4j.bridge.SLF4JBridgeHandler;
import java.io.File;
public class TomcatLauncher {
static {
// 关键:将 Tomcat 原生的 JUL 日志桥接到 SLF4J,这样你才能看到 DEBUG 日志
java.util.logging.LogManager.getLogManager().reset();
SLF4JBridgeHandler.install();
}
public static void main(String[] args) throws LifecycleException {
// 1. 实例化 Tomcat
Tomcat tomcat = new Tomcat();
// 2. 设置基础配置
tomcat.setPort(8080);
tomcat.getConnector(); // 触发 Connector 的创建
// 3. 设置 Web 应用上下文
// 参数1: contextPath (浏览器访问路径)
// 参数2: docBase (webapp 文件夹的物理路径)
String webappPath = new File("src/main/webapp").getAbsolutePath();
Context context = tomcat.addWebapp("", webappPath);
// 4. 启动 Tomcat
System.out.println(">>> 准备触发 Lifecycle.init() 和 start()...");
tomcat.start();
System.out.println(">>> Tomcat 已启动,监听端口: 8080");
// 5. 阻塞主线程,保持服务器运行
tomcat.getServer().await();
}
}
2.3:配置日志
在 src/main/resources 下创建 logback.xml。这样你就能在控制台看到 Lifecycle 状态切换的详细过程:
xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.apache.catalina" level="DEBUG" />
<logger name="org.apache.coyote" level="DEBUG" />
<logger name="org.apache.tomcat" level="DEBUG" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
第三步:如何 Debug 源码
请按以下步骤操作:
- 找到核心类:在 IDEA 中双击 Shift,搜索并打开 org.apache.catalina.util.LifecycleBase。
- 设置断点:在 init() 方法打上断点。
- 启动调试:在 TomcatLauncher 类上右键,选择 Debug 'TomcatLauncher.main()'。