1220 字
约 4 分钟
1
War 包部署入门
War 包部署入门
1. 一句话简介
WAR(Web Application Archive)是把 Java Web 应用连同资源打包成 .war 后缀的标准归档格式,部署到外部 Servlet 容器(如 Tomcat)中运行。Spring Boot 默认打成内嵌 Tomcat 的可执行 JAR,但通过三处改动可改为 WAR 打包:将 <packaging> 改为 war、把 spring-boot-starter-tomcat 的 scope 设为 provided(由外部 Tomcat 提供、不打入包内)、启动类继承 SpringBootServletInitializer 并覆写 configure 方法。核心解决的是「把 Spring Boot 应用装进传统 Java Web 容器运维体系」这一兼容性需求。
2. 什么时候使用
- ✅ 适用场景
- 公司/团队运维标准要求统一使用 Tomcat 集群管理应用,不允许自启动进程,需要接入已有监控与发布流程。
- 需要在同一个 Tomcat 实例的同一进程内部署多个应用,共享容器资源、节省端口与内存开销。
- 需要依赖 Tomcat 管理控制台(Tomcat Manager)来管理、监控、热卸载应用。
- 已有存量 Servlet/Spring MVC 应用运行在外部容器中,新模块需与之同容器共存、保持一致部署方式。
- 自主可控地选择 Servlet 容器版本(如切换为 Jetty、Undertow)并对容器做深度调优。
- ❌ 不适用/需谨慎
- 微服务、容器化(Docker/K8s)、云原生场景:可执行 JAR 单文件、无状态、易水平扩展,WAR 反而不便。
- 追求零运维、快速启动(
java -jar秒级起)的场景:WAR 需先安装配置外部 Tomcat,部署链路更长。 - 需要进程级隔离/弹性伸缩的应用:WAR 多应用共享同一容器与类加载,故障可能互相影响。
- 需要应用内自由指定端口与上下文路径的场景:部署到外部 Tomcat 后端口由
server.xml决定,上下文路径由 WAR 文件名决定,application.yml中的相关配置会被忽略。
3. 常见业务场景
- 统一 Tomcat 集群管理:企业既有大量传统 Java Web 应用由专门 Tomcat 集群承载,新增服务被打成
demo-war.war放入webapps目录,接入同一套发布、监控、备份体系,避免引入第二套进程管理方式。 - 单容器多应用共置:在一台 Tomcat 中同时部署多个轻量应用,共享 JVM 与连接线程池,适合资源受限、规模不大的内部管理系统。
- WAR + JAR 双模式开发:本模块启动类同时保留
main方法与configure方法(继承SpringBootServletInitializer),开发期用mvn spring-boot:run以内嵌 Tomcat 快速调试(端口 8080、上下文/demo),生产期打成 WAR 部署,一套代码两用。 - 兼容存量 Servlet 架构:需与老 web.xml 架构的系统共存或平滑迁移时,WAR 形式保持相同容器治理模型,过渡成本最低。
- 核心改动演示验证:通过
mvn package生成target/demo-war.war,用jar tf可检查包内WEB-INF/classes、WEB-INF/lib存在而tomcat-embed-*.jar缺失(因scope=provided),直观验证 WAR 打包机制是否生效。
4. 同类技术对比
| 对比维度 | 可执行 JAR(Spring Boot 默认) | WAR 包(外部 Tomcat 部署) | 容器化 Docker/K8s |
|---|---|---|---|
| 运行方式 | java -jar app.jar,内嵌 Tomcat |
放入 Tomcat webapps 由容器启动 |
构建镜像,由编排平台调度 |
| 部署复杂性 | 低,单文件即可运行 | 中,需安装配置外部容器 | 较高,需镜像仓库与集群 |
| 多应用共享 | 不共享,每应用独立进程 | 同一 Tomcat 可部署多个应用 | 不共享,Pod 间隔离 |
| 端口把持 | 应用内配置 | 由容器 server.xml 决定 |
由网络编排(Service/Ingress)决定 |
| 扩展性 | 一般,需自行管进程 | 弱于 JAR,受单容器容量限制 | 强,弹性伸缩、无状态 |
| 进程隔离性 | 各应用相互独立 | 弱,共享容器类加载与 JVM | 强,Pod 级隔离 |
| 环境依赖 | 仅 JVM | JVM + 外部 Servlet 容器 | 容器运行时 + 编排平台 |
| 学习成本 | 低 | 低~中 | 高 |
选型建议:追求快速启动、微服务化、云原生部署时可执行 JAR,演进到容器化(Docker/K8s)时结合镜像在集群中运行;当必须融入传统 Tomcat 运维体系、需要同容器多应用共置或接入 Tomcat Manager 时选 WAR 包;容器化规模伸缩是 WAR 与 JAR 都无法替代的,只有上编排平台才能获得真正的弹性与隔离。
评论
0 条
还没有评论,先写一条吧。