spring boot 项目部署到外部 tomcat 需三步:①将 pom.xml 中 jar 改为 war;②在 spring-boot-starter-web 中排除 spring-boot-starter-tomcat;③主启动类继承 springbootservletinitializer 并重写 configure 方法。

Spring Boot 默认用内置 Tomcat,要让它跑在外部独立的 Tomcat 上,关键不是改配置文件,而是让项目变成标准 WAR 包,并适配 Servlet 容器的启动机制。核心改动就三处,缺一不可。
改成 WAR 打包方式
打开 pom.xml,把原本的:
改成:
这一步告诉 Maven:我要生成符合 Java EE 规范的 Web 归档包,不是自启动的 JAR。
排除内置 Tomcat 依赖
spring-boot-starter-web 默认带了 spring-boot-starter-tomcat,它和外部 Tomcat 冲突,必须去掉。在该依赖里加 <exclusions></exclusions>:
- 找到
spring-boot-starter-web的 dependency 块 - 在里面添加
<exclusions><exclusion><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-tomcat</artifactid></exclusion></exclusions>
注意:不要手动加 spring-boot-starter-tomcat 依赖,更不要设为 provided —— 排除干净即可,外部容器会提供运行时所需的 Servlet API。
主类继承 SpringBootServletInitializer
外部 Tomcat 启动时不调 main 方法,而是走 Servlet 标准生命周期。所以启动类必须主动适配:
- 让主启动类(如
Application.java)继承 SpringBootServletInitializer - 重写
configure(SpringApplicationBuilder)方法,返回builder.sources(YourApplicationClass.class) -
main方法保留不动,本地调试仍可用
示例:
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
}
部署与验证
打包后得到 WAR 文件,直接丢进 Tomcat 的 webapps 目录即可。启动 Tomcat,访问 http://localhost:8080/your-app-context(上下文路径默认是 WAR 包名,如 demo.war → /demo)。
如果报错 ClassNotFoundException: javax.servlet.Filter,说明少了 Servlet API —— 此时需确认是否误删了 javax.servlet-api,但 Spring Boot 2.4+ 通常不需要显式添加;若用老版本或 IDE 调试报错,可加 <scope>provided</scope> 的 javax.servlet-api 依赖。











