Apache Tomcat 介绍
Apache Tomcat 介绍
Apache Tomcat (通常简称 Tomcat) 是一个开源的 Servlet 容器 和 Web 服务器,由 Apache 软件基金会开发和维护。
-
核心功能:
- Servlet 容器: Tomcat 的核心是实现了 Java Servlet 和 JavaServer Pages (JSP) 规范。它负责加载、初始化、执行和销毁 Servlet 和 JSP 页面。
- Web 服务器: 它能够处理 HTTP 请求,发送 HTTP 响应,并提供静态资源(如 HTML, CSS, JavaScript, 图片)的访问服务。
- Java EE Web Profile 实现: Tomcat 提供了 Java EE (现 Jakarta EE) Web Profile 中定义的核心技术,包括 Servlet, JSP, EL, WebSocket 等。
-
主要特点:
- 开源免费: 完全免费使用。
- 轻量级: 相比于完整的 Java EE 应用服务器(如 WildFly, WebLogic, WebSphere),Tomcat 更加轻量、启动更快、资源占用更少。
- 易于使用和配置: 配置文件(主要是
server.xml,web.xml)相对简单,社区文档丰富。 - 广泛应用: 是学习 Java Web 开发和部署中小型 Web 应用的首选。
-
适用场景:
- 学习 Java Web 技术 (Servlet, JSP)。
- 部署基于 Spring MVC, Struts 等框架的传统 Web 应用。
- 部署 RESTful API 后端服务。
- 作为静态资源服务器。
-
不适用场景:
- 需要完整的 Java EE 功能,如 EJB (Enterprise JavaBeans), JMS (Java Message Service), JTA (Java Transaction API) 等。对于这些场景,需要使用 WildFly, GlassFish 等完整应用服务器。
Tomcat 基本使用
1. 下载与安装
- 下载: 访问官方下载页面 https://tomcat.apache.org/。
- 选择一个稳定版本(如 Tomcat 10.x 或 9.x)。
- 下载 "Core" 下的 .zip 或 .tar.gz 文件(免安装版)。
- 解压: 将下载的压缩包解压到一个目录,例如
D:\apache-tomcat-10.1.18。 - 目录结构:
bin/: 启动和停止脚本 (startup.bat,shutdown.batfor Windows;startup.sh,shutdown.shfor Linux/Mac)。conf/: 配置文件目录 (server.xml,web.xml,context.xml等)。lib/: Tomcat 运行所需的 JAR 包。logs/: 日志文件目录。webapps/: Web 应用部署目录。将你的 WAR 包或 Web 应用目录放在这里。work/: JSP 编译后生成的 Servlet 源码和字节码文件。temp/: 临时文件目录。
2. 启动与停止
- 启动:
- Windows: 进入
bin目录,双击startup.bat或在命令行中运行startup.bat。 - Linux/Mac: 进入
bin目录,运行./startup.sh。
- Windows: 进入
- 停止:
- Windows: 运行
shutdown.bat。 - Linux/Mac: 运行
./shutdown.sh。
- Windows: 运行
- 验证: 打开浏览器,访问
http://localhost:8080。如果看到 Tomcat 的欢迎页面,说明启动成功。
3. 部署 Web 应用
有几种方式将你的 Web 应用部署到 Tomcat:
-
方式一:直接复制 WAR 包或目录
- 将你的 Web 应用打包成 WAR 文件(例如
myapp.war)。 - 将
myapp.war文件复制到webapps/目录下。 - Tomcat 会自动解压 WAR 包并部署应用。访问
http://localhost:8080/myapp即可。
- 将你的 Web 应用打包成 WAR 文件(例如
-
方式二:使用 Manager App (图形化界面)
- 确保
conf/tomcat-users.xml中配置了管理员用户:<tomcat-users><role rolename="manager-gui"/><user username="admin" password="password" roles="manager-gui"/> </tomcat-users> - 重启 Tomcat。
- 访问
http://localhost:8080/manager,用配置的用户名密码登录。 - 在界面中上传 WAR 文件进行部署。
- 确保
核心版本映射关系表
下表是选择 Tomcat 版本时最重要的参考依据:
https://tomcat.apache.org/whichversion.html

注意:
TBD表示 "To Be Determined"。从 Tomcat 10 开始,由于 Jakarta EE 迁移,包名从javax.*变更为jakarta.*,这是一个重要的不兼容变更。
二、 主要版本深度解析
1. Tomcat 11.0.x (新项目的选择)
- 发布于2024年10月
- 支持最新的 Jakarta Servlet 6.1、JSP 4.0、EL 6.0 等规范,API 包名从
javax.*彻底迁移为jakarta.* - 集成 Project Loom(JEP 444),允许使用轻量级虚拟线程处理请求,替代传统平台线程池,显著提高高并发场景下的吞吐量
- Tomcat 11 需运行在 Java 21 及以上版本,相比 Tomcat 10,其架构变化较小,但通过规范升级和虚拟线程支持进一步优化了性能与可扩展性
2. Tomcat 10.1.x (当前主流选择之一)
- 定位: 实现了 Jakarta EE 9 和 Jakarta EE 10 平台。
- 关键特性:
- 包名变更: 最大的变化是从
javax.servlet等迁移到jakarta.servlet。这意味着 Tomcat 10+ 无法直接运行为 Tomcat 9 或更早版本编译的应用。你需要使用新的jakarta.*API 重新编译你的应用。 - 现代规范: 支持最新的 Servlet 5.0/6.0, JSP 3.1 等规范。
- 10.1.x 需要 Java 11+。
- 包名变更: 最大的变化是从
- 适用场景:
- 新的、基于 Jakarta EE 9/10 技术栈的项目。
- 使用 Spring Framework 6 / Spring Boot 3 的项目(它们也要求
jakarta.*命名空间)。
3. Tomcat 9.0.x (最广泛使用的稳定版)
- 定位: 实现了 Java EE 8 平台。
- 关键特性:
- 成熟稳定: 经过多年验证,非常稳定可靠。
- 重大改进: 引入了对 HTTP/2 的支持(需 Java 9+ 或 Tomcat Native),以及对 OpenSSL TLS 和 SNI (Server Name Indication) 的支持。
- Java 8+: 对 Java 8 提供了极佳的支持。
- 适用场景:
- 绝大多数现有和新项目的首选。
- 基于传统
javax.*命名空间的项目。 - 使用 Spring Framework 5 / Spring Boot 2 的项目。
- 需要 HTTP/2 支持但不想立即迁移到
jakarta.*的项目。
更早版本 (10.0.x,8.5.x, 8.0.x ,7.0.x, 6.0.x 等)
- 状态: 已归档 (Archived),不再接收任何更新,包括安全补丁。
- 风险: 存在未修复的安全漏洞,绝对不应该在生产环境中使用。
- 用途: 仅用于学习历史或维护极其陈旧的遗留系统。
我们当前springboot 集成的 tomcat版本.

<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.63</version><scope>compile</scope><exclusions><exclusion><artifactId>tomcat-annotations-api</artifactId><groupId>org.apache.tomcat</groupId></exclusion></exclusions>
</dependency>
-
<groupId>org.apache.tomcat.embed</groupId>- 这是该依赖的组ID (Group ID)。
org.apache.tomcat.embed是 Apache Tomcat 项目中专门为“嵌入式”使用场景发布的库的命名空间。这些库允许你将 Tomcat 服务器直接“嵌入”到你的 Java 应用程序中运行(例如,在 Spring Boot 应用中)。
-
<artifactId>tomcat-embed-core</artifactId>- 这是该依赖的构件ID (Artifact ID)。
tomcat-embed-core是嵌入式 Tomcat 的核心模块。它包含了 Servlet 容器的核心功能,如:Servlet,Filter,Listener等接口的实现。- HTTP 请求/响应处理逻辑。
- Web 应用上下文 (
ServletContext) 管理。 - 内嵌的连接器 (Connector) 和引擎 (Engine)。
- 简单说,这是让你的应用能运行 Servlet 和 JSP 的最基础、最重要的部分。
-
<version>9.0.63</version>- 指定了要使用的
tomcat-embed-core库的具体版本号。 9.0.63表示这是 Tomcat 9.0.x 系列的一个特定补丁版本。选择这个版本意味着你的应用将基于 Tomcat 9.0.63 的行为和特性运行。
- 指定了要使用的
-
<scope>compile</scope>- 定义了此依赖的作用域 (Scope)。
compile是 Maven 默认的作用域,表示:- 该依赖在编译 (Compile) 阶段是必需的(你的代码需要引用它提供的类)。
- 该依赖在测试 (Test) 阶段也是可用的。
- 该依赖会被打包到最终的 WAR 或 JAR 文件中(对于可执行 JAR 尤其重要)。
- 总结:
compile意味着这是一个核心的、生产环境必需的依赖。
-
<exclusions>...</exclusions>- 这是一个排除 (Exclusion) 块。它的作用是告诉 Maven:当引入
tomcat-embed-core这个依赖时,请不要自动包含它所依赖的某些传递性依赖 (transitive dependencies)。
- 这是一个排除 (Exclusion) 块。它的作用是告诉 Maven:当引入
-
<exclusion>- 在
<exclusions>块内定义了一个具体的排除项。
- 在
-
<artifactId>tomcat-annotations-api</artifactId>- 指定要排除的依赖的构件ID。
-
<groupId>org.apache.tomcat</groupId>- 指定要排除的依赖的组ID。
- 注意这里的
groupId是org.apache.tomcat,而不是上面embed的org.apache.tomcat.embed。这表明我们要排除的是一个标准的 Tomcat 库,而不是嵌入式专用的库。
为什么需要 exclusion?
这是理解这段配置的关键。
tomcat-embed-core本身会依赖于另一个库tomcat-annotations-api(由org.apache.tomcat:tomcat-annotations-api提供)。tomcat-annotations-api包含了像@WebServlet,@WebFilter,@WebListener等注解的定义。- 在大多数现代 Java Web 开发中,尤其是使用 Spring Boot 时,这些注解的定义通常来自于更标准的 API 依赖,比如
jakarta.servlet-api或javax.servlet-api。 - 如果不进行排除,可能会导致以下问题:
- 类路径冲突 (Classpath Conflicts): 项目里可能同时存在两个提供相同注解的 JAR 包,JVM 可能加载错版本,导致不可预知的行为。
- 重复定义: 同一个类(如
jakarta.servlet.annotation.WebServlet)出现在多个 JAR 中,违反了“单一定律”(Single Responsibility Principle),可能导致编译或运行时错误。 - 依赖混乱: 让构建工具管理不必要的传递依赖。
通过 <exclusion>,开发者明确地告诉 Maven:“我信任并使用来自 servlet-api 规范的注解定义,我不需要 tomcat-embed-core 自带的那个 tomcat-annotations-api 版本。” 这样可以确保依赖关系清晰、干净,避免潜在的冲突。
总结
“我的项目需要 Tomcat 9.0.63 的嵌入式核心功能 (
tomcat-embed-core) 来作为内嵌的 Servlet 容器,并且这个依赖是编译和运行都必需的 (scope=compile)。但是,请在引入这个核心库时,忽略掉它自带的tomcat-annotations-api这个传递性依赖,以防止与项目中其他地方提供的标准 Servlet API 发生冲突。”
这种模式在构建自定义的嵌入式 Tomcat 应用或使用特定框架时非常常见,体现了对依赖树的精细控制能力。
