------------------------------------------------------
Spring Boot 项目的部署可以使用 Tomcat,但并非只能用 Tomcat。具体取决于项目的配置和需求,主要分为两种情况:** 内置服务器部署 (默认)和外部服务器部署 **。
一、默认:内置 Tomcat 部署(最常用)
Spring Boot 的
spring-boot-starter-web
依赖默认集成了 ** 嵌入式 Tomcat **(作为默认的 Servlet 容器),因此:- 项目可以直接打成 JAR 包,通过
java -jar 项目名.jar
命令启动,无需额外安装 Tomcat 服务器。 - 内置 Tomcat 会自动启动并处理 HTTP 请求,这是 Spring Boot 最便捷的部署方式(尤其适合开发、测试和小型应用)。
依赖示例(默认包含 Tomcat):
xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 默认包含 spring-boot-starter-tomcat -->
</dependency>
二、可选:切换其他内置服务器
Spring Boot 支持替换内置服务器(如 Jetty、Undertow),只需排除 Tomcat 依赖并引入目标服务器依赖即可。
示例:替换为 Jetty
xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除默认的 Tomcat 依赖 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency><!-- 引入 Jetty 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
示例:替换为 Undertow(性能更优,适合高并发)
xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
三、传统方式:部署到外部 Tomcat
如果需要将 Spring Boot 项目部署到外部独立的 Tomcat 服务器(如企业统一管理的 Tomcat 集群),需进行如下配置:
-
修改打包方式为 WAR在
pom.xml
中设置:xml<packaging>war</packaging>
-
排除内置 Tomcat 的依赖(避免冲突)xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions> </dependency><!-- 保留 Tomcat API 依赖(编译时需要,运行时由外部 Tomcat 提供) --> <dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><scope>provided</scope> </dependency>
-
配置启动类继承
SpringBootServletInitializer
使外部 Tomcat 能识别 Spring Boot 应用:java运行@SpringBootApplication public class MyApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(MyApplication.class);}public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} }
-
打包部署执行
mvn clean package
生成 WAR 包,放入外部 Tomcat 的webapps
目录下,启动 Tomcat 即可。
总结
- Spring Boot 项目默认使用内置 Tomcat,通过 JAR 包直接部署(最简便)。
- 可替换为 Jetty、Undertow 等其他内置服务器,适应不同性能需求。
- 也支持部署到外部 Tomcat(需修改打包方式和依赖配置),适合传统企业级部署场景。
因此,“部署是否用 Tomcat” 取决于具体配置,Tomcat 是默认选择,但不是唯一选择。
------------------------------------------------------
在 Spring Boot 中,Tomcat、Jetty、Undertow 是最常用的三种嵌入式 Servlet 容器,均支持 Servlet 规范,但在性能、资源占用、功能特性等方面存在差异。选择时需结合项目场景(如并发量、资源限制、功能需求等),以下是详细对比:
一、基本背景
容器 | 所属组织 | 特点概述 |
---|---|---|
Tomcat | Apache | 最主流的 Servlet 容器,历史悠久、生态完善、兼容性强,默认集成在 Spring Boot |
Jetty | Eclipse | 轻量级、灵活,适合嵌入式场景,可按需扩展组件 |
Undertow | Red Hat | 基于 NIO 异步 IO 模型,高并发性能优异,内存占用低 |
二、核心维度对比
1. 性能与并发
-
Tomcat:基于 BIO(阻塞 IO)和 NIO 混合模型(默认 NIO),处理中等并发场景稳定,但在极高并发(如 10w+ TPS) 下性能可能下降,资源消耗(CPU / 内存)略高。优势在于优化成熟,对传统同步请求(如表单提交)处理高效。
-
Jetty:基于 NIO 模型,设计更轻量,短连接场景(如 REST API)性能优于 Tomcat,但长连接场景(如 WebSocket)表现一般。并发处理能力中等,适合中小规模应用。
-
Undertow:基于 NIO 异步非阻塞模型,支持IO 多路复用,并提供异步 Servlet(Jakarta Servlet 3.1+)和 WebSocket 原生支持,高并发场景下性能最优(尤其高吞吐量 API 服务)。相同硬件资源下,能处理更多并发连接,响应延迟更低。
2. 资源占用
- 内存占用:Undertow < Jetty < Tomcat(同等配置下,Undertow 内存占用约比 Tomcat 低 10%-20%)。
- 启动速度:Jetty < Undertow < Tomcat(Jetty 组件按需加载,启动最快;Tomcat 因功能全,启动略慢)。
3. 功能与扩展性
-
Tomcat:功能最全,支持所有 Servlet 规范(最新支持 Servlet 6.0)、JSP、WebSocket 等,内置丰富的安全特性(如 CSRF 防护、角色认证),生态插件多(如 APR 原生库加速)。扩展性中等,配置相对固定(如需深度定制需修改源码或复杂配置)。
-
Jetty:模块化设计,可按需裁剪组件(如仅保留 HTTP 服务器功能),扩展性极强,适合嵌入式场景(如嵌入到 IDE、物联网设备)。对 JSP 支持较弱(需额外配置),更适合纯 API 服务。
-
Undertow:支持 Servlet 6.0、WebSocket、HTTP/2,提供灵活的处理器链(Handler Chain)机制,可通过代码动态配置请求处理流程(无需 XML),扩展性优于 Tomcat。不支持 JSP(需配合 JSP 引擎,不推荐),专注于高性能 HTTP 服务。
4. 兼容性与生态
-
Tomcat:兼容性最佳,几乎所有 Java Web 框架(Spring、Struts 等)和第三方组件(如 Shiro、Security)都优先适配 Tomcat,遇到问题时解决方案最多。
-
Jetty:兼容性良好,但部分老旧组件(如依赖特定 Tomcat 类的库)可能存在适配问题,社区活跃度低于 Tomcat。
-
Undertow:兼容性较好(支持主流框架),但生态不如 Tomcat 完善,部分特殊场景(如复杂 JSP 页面)需额外处理。
5. 适用场景
容器 | 最佳场景 | 不推荐场景 |
---|---|---|
Tomcat | 传统 Web 应用(含 JSP)、中小规模 API 服务、团队熟悉度高的场景 | 超高性能要求的高并发 API 服务 |
Jetty | 嵌入式应用(如 IDE 插件、物联网设备)、轻量 API 服务、资源受限的环境 | 复杂 JSP 应用、高并发长连接场景 |
Undertow | 高并发 API 服务(如微服务网关)、WebSocket 实时通信(如聊天、消息推送) | 依赖 JSP 的传统 Web 应用、团队对其不熟悉的场景 |
三、Spring Boot 中切换容器的配置
Spring Boot 默认使用 Tomcat,切换为 Jetty 或 Undertow 只需修改
pom.xml
依赖:1. 切换为 Jetty
xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除默认 Tomcat --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<!-- 引入 Jetty -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
2. 切换为 Undertow
xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<!-- 引入 Undertow -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
总结
- 追求稳定性和兼容性:选 Tomcat(适合大多数常规项目)。
- 追求轻量和嵌入式场景:选 Jetty(适合资源受限或定制化需求高的场景)。
- 追求高并发和高性能:选 Undertow(适合微服务、API 网关等高频请求场景)。
实际项目中,建议先通过压测(如 Jmeter、Gatling)验证不同容器在目标场景下的表现,再结合团队熟悉度做选择。
------------------------------------------------------