Apache Tomcat 介绍

Apache Tomcat 介绍

Apache Tomcat (通常简称 Tomcat ) 是一个开源的 Servlet 容器Web 服务器,由 Apache 软件基金会开发和维护。

  • 核心功能:

    1. Servlet 容器: Tomcat 的核心是实现了 Java Servlet 和 JavaServer Pages (JSP) 规范。它负责加载、初始化、执行和销毁 Servlet 和 JSP 页面。
    2. Web 服务器: 它能够处理 HTTP 请求,发送 HTTP 响应,并提供静态资源(如 HTML, CSS, JavaScript, 图片)的访问服务。
    3. 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. 下载与安装
  1. 下载 : 访问官方下载页面 https://tomcat.apache.org/。
    • 选择一个稳定版本(如 Tomcat 10.x 或 9.x)。
    • 下载 "Core" 下的 .zip.tar.gz 文件(免安装版)。
  2. 解压 : 将下载的压缩包解压到一个目录,例如 D:\apache-tomcat-10.1.18
  3. 目录结构 :
    • bin/: 启动和停止脚本 (startup.bat, shutdown.bat for Windows; startup.sh, shutdown.sh for 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 : 运行 shutdown.bat
    • Linux/Mac : 运行 ./shutdown.sh
  • 验证 : 打开浏览器,访问 http://localhost:8080。如果看到 Tomcat 的欢迎页面,说明启动成功。
3. 部署 Web 应用

有几种方式将你的 Web 应用部署到 Tomcat:

  • 方式一:直接复制 WAR 包或目录

    1. 将你的 Web 应用打包成 WAR 文件(例如 myapp.war)。
    2. myapp.war 文件复制到 webapps/ 目录下。
    3. Tomcat 会自动解压 WAR 包并部署应用。访问 http://localhost:8080/myapp 即可。
  • 方式二:使用 Manager App (图形化界面)

    1. 确保 conf/tomcat-users.xml 中配置了管理员用户:

      复制代码
      <tomcat-users>
          <role rolename="manager-gui"/>
          <user username="admin" password="password" roles="manager-gui"/>
      </tomcat-users>
    2. 重启 Tomcat。

    3. 访问 http://localhost:8080/manager,用配置的用户名密码登录。

    4. 在界面中上传 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 9Jakarta 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>

  1. <groupId>org.apache.tomcat.embed</groupId>

    • 这是该依赖的组ID (Group ID)
    • org.apache.tomcat.embed 是 Apache Tomcat 项目中专门为"嵌入式"使用场景发布的库的命名空间。这些库允许你将 Tomcat 服务器直接"嵌入"到你的 Java 应用程序中运行(例如,在 Spring Boot 应用中)。
  2. <artifactId>tomcat-embed-core</artifactId>

    • 这是该依赖的构件ID (Artifact ID)
    • tomcat-embed-core 是嵌入式 Tomcat 的核心模块 。它包含了 Servlet 容器的核心功能,如:
      • Servlet, Filter, Listener 等接口的实现。
      • HTTP 请求/响应处理逻辑。
      • Web 应用上下文 (ServletContext) 管理。
      • 内嵌的连接器 (Connector) 和引擎 (Engine)。
    • 简单说,这是让你的应用能运行 Servlet 和 JSP 的最基础、最重要的部分。
  3. <version>9.0.63</version>

    • 指定了要使用的 tomcat-embed-core 库的具体版本号
    • 9.0.63 表示这是 Tomcat 9.0.x 系列的一个特定补丁版本。选择这个版本意味着你的应用将基于 Tomcat 9.0.63 的行为和特性运行。
  4. <scope>compile</scope>

    • 定义了此依赖的作用域 (Scope)
    • compile 是 Maven 默认的作用域,表示:
      • 该依赖在编译 (Compile) 阶段是必需的(你的代码需要引用它提供的类)。
      • 该依赖在测试 (Test) 阶段也是可用的。
      • 该依赖会被打包到最终的 WAR 或 JAR 文件中(对于可执行 JAR 尤其重要)。
    • 总结:compile 意味着这是一个核心的、生产环境必需的依赖。
  5. <exclusions>...</exclusions>

    • 这是一个排除 (Exclusion) 块。它的作用是告诉 Maven:当引入 tomcat-embed-core 这个依赖时,请不要自动包含它所依赖的某些传递性依赖 (transitive dependencies)。
  6. <exclusion>

    • <exclusions> 块内定义了一个具体的排除项。
  7. <artifactId>tomcat-annotations-api</artifactId>

    • 指定要排除的依赖的构件ID。
  8. <groupId>org.apache.tomcat</groupId>

    • 指定要排除的依赖的组ID。
    • 注意这里的 groupIdorg.apache.tomcat,而不是上面 embedorg.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-apijavax.servlet-api
  • 如果不进行排除,可能会导致以下问题:
    1. 类路径冲突 (Classpath Conflicts): 项目里可能同时存在两个提供相同注解的 JAR 包,JVM 可能加载错版本,导致不可预知的行为。
    2. 重复定义 : 同一个类(如 jakarta.servlet.annotation.WebServlet)出现在多个 JAR 中,违反了"单一定律"(Single Responsibility Principle),可能导致编译或运行时错误。
    3. 依赖混乱: 让构建工具管理不必要的传递依赖。

通过 <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 应用或使用特定框架时非常常见,体现了对依赖树的精细控制能力。

相关推荐
云烟成雨TD6 分钟前
Spring AI 1.x 系列【28】基于内存和 MySQL 的多轮对话实现案例
java·人工智能·spring
Lyyaoo.8 分钟前
【JAVA基础面经】String、StringBuffer、StringBuilder
java·开发语言
TeamDev15 分钟前
JxBrowser 8.18.2 版本发布啦!
java·前端·跨平台·桌面应用·web ui·jxbrowser·浏览器控件
晴天sir18 分钟前
Redis 在业务中的几种典型用法
java·数据库·redis
WJX_KOI23 分钟前
MemOS —— 为大语言模型 (LLMs) 和智能体打造的记忆操作系统。
java·人工智能·语言模型
_日拱一卒28 分钟前
LeetCode:矩阵置零
java·数据结构·线性代数·算法·leetcode·职场和发展·矩阵
weixin_4080996732 分钟前
【实战教程】懒人精灵如何实现 OCR 文字识别?接口调用完整指南(附可运行示例)
java·前端·人工智能·后端·ocr·api·懒人精灵
花千树-0101 小时前
Java Agent 集成 MCP 工具协议:让 AI 真正驱动企业系统
java·ai·langchain·ai agent·mcp·harness·j-langchain
橘子编程1 小时前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式
君以思为故1 小时前
认识Linux -- 线程同步与互斥
java·开发语言