spring boot 项目需改造成 war 包并部署到外部 tomcat,核心是三步:①修改 pom.xml 的 packaging 为 war;②排除 spring-boot-starter-tomcat 依赖;③主类继承 springbootservletinitializer 并重写 configure 方法。

Spring Boot 默认使用内置 Tomcat,要让它运行在外部独立的 Tomcat 容器中,核心是把项目从可执行 JAR 改为标准 WAR 包,并让 Spring Boot 主动适配 Servlet 容器的生命周期。这不是简单改个配置就能跑通,而是涉及打包方式、依赖调整和启动逻辑三处关键改动。
修改打包类型为 WAR
这是第一步,也是最基础的标识。打开 pom.xml,将原本的:
<packaging>jar</packaging>
改为:
<packaging>war</packaging>
这告诉 Maven 构建系统:本项目要生成一个符合 Servlet 规范的 Web 归档包,而非自包含的可执行 JAR。
排除内置 Tomcat 依赖
Spring Boot 的 spring-boot-starter-web 默认带了嵌入式 Tomcat(spring-boot-starter-tomcat)。外部 Tomcat 运行时,这个依赖不仅多余,还会引发类加载冲突或端口绑定异常。
需在 spring-boot-starter-web 中显式排除它:
- 找到该依赖节点
- 添加
<exclusions></exclusions>块,移除spring-boot-starter-tomcat
示例片段:
<dependency><br> <groupid>org.springframework.boot</groupid><br> <artifactid>spring-boot-starter-web</artifactid><br> <exclusions><br> <exclusion><br> <groupid>org.springframework.boot</groupid><br> <artifactid>spring-boot-starter-tomcat</artifactid><br> </exclusion><br> </exclusions><br></dependency>
继承 SpringBootServletInitializer 并重写 configure 方法
外部 Tomcat 启动时,会调用标准的 ServletContainerInitializer 流程,而不是直接执行你的 main 方法。因此,主启动类必须适配这一机制:
- 让启动类继承
SpringBootServletInitializer - 重写
configure(SpringApplicationBuilder)方法,返回指向自身类的builder.sources(...) - 保留原有的
main方法(本地调试仍可用)
代码示意:
@SpringBootApplication<br>public class Application extends SpringBootServletInitializer {<br> @Override<br> protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {<br> return builder.sources(Application.class);<br> }<br><br> public static void main(String[] args) {<br> SpringApplication.run(Application.class, args);<br> }<br>}
可选但推荐:添加 servlet-api 编译依赖
虽然 Spring Boot 2.4+ 对此要求已放宽,但为兼容性与 IDE 提示清晰,建议显式声明 Servlet API 依赖,并设为 provided(由外部 Tomcat 提供,不打入 WAR):
<dependency><br> <groupid>javax.servlet</groupid><br> <artifactid>servlet-api</artifactid><br> <version>4.0.1</version><br> <scope>provided</scope><br></dependency>
注意:若使用 Jakarta EE 9+(如 Tomcat 10),应改用 jakarta.servlet:jakarta.servlet-api。











