当前位置: 首页 > news >正文

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.xmlweb.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.batshutdown.bat for Windows; startup.shshutdown.sh for Linux/Mac)。
    • conf/: 配置文件目录 (server.xmlweb.xmlcontext.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 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>

  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 容器的核心功能,如:
      • ServletFilterListener 等接口的实现。
      • 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。
    • 注意这里的 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
  • 如果不进行排除,可能会导致以下问题:
    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 应用或使用特定框架时非常常见,体现了对依赖树的精细控制能力。

http://www.dtcms.com/a/561232.html

相关文章:

  • 国网公司网站建设宠物网站的目的
  • 怎么找做网站的外包公司二级域名是什么
  • CentOS 7/8/9 一键安装 Python 3.10+ 并配置默认版本
  • Harmony鸿蒙开发0基础入门到精通Day08--JavaScript篇
  • OpenCV(十八):绘制文本
  • Arbess实践指南(3) - 使用Arbess+sourcefare+PostIn实现Java项目自动化部署 + 代码扫描 + 接口自动化测试
  • 一,PCB介绍
  • 重庆网站建设机构科技进步是国防强大的重要的保证
  • asp网站用什么数据库做网站怎么导入源码
  • 【Docker】容器操作和实战
  • 阿里巴巴网站如何做免费推广wordpress首页文章轮播
  • 缓存三大问题及解决方案
  • 深度学习周报(10.27~11.2)
  • 怎么做便民信息网站原创小说手机网站制作需要多少钱
  • Java外功精要——Spring AOP
  • 线程从共享队列取任务的底层机制
  • 一站式网站建设报价怎样做商城网站
  • 宜春公司网站建设网页改进方案
  • 「经典数字题」集合 | C/C++
  • centos7实测
  • 【3DV 进阶-5】3D生成中 Inductive Bias (归纳偏置)的技术路线图
  • HOT100题打卡第26天——动态规划
  • 第五章 二项式系数
  • 制作网站语言网络营销方法有什么
  • 合肥网站建站推广从零开始做电影网站
  • 电商Web 渗透测试小小清单
  • 做信息流推广需要建立网站么最基本的网站设计
  • 基于双向时序卷积网络与门控循环单元(BiTCN-GRU)混合模型的时间序列预测MATLAB代码
  • DevOps(devops/k8s/docker/Linux)学习笔记-2
  • 三点水网站建设wordpress wp-polls