使用Gradle和Spring Boot如何生成可在Tomcat运行的非内嵌War包?
Spring Boot + Gradle 生成外置Tomcat可部署War包的实现方法
实现脱离Spring Boot内嵌运行、可直接部署到独立Tomcat的War包,核心逻辑很简单:一是把内嵌Web容器的依赖从最终打包范围排除,二是给应用提供外部Servlet容器能识别的启动入口,没有复杂的特殊配置。
具体配置步骤
- 调整Gradle构建脚本的插件引入
在项目根目录的build.gradle文件中,补充引入war打包插件,替换原有的纯Jar打包配置:plugins { id 'org.springframework.boot' version '你的项目对应Spring Boot版本' id 'io.spring.dependency-management' id 'java' id 'war' // 新增War打包插件 } - 调整内嵌容器的依赖作用域
将Spring Boot自带的内嵌Tomcat依赖标记为provided作用域——这类依赖仅在本地编译、调试时可用,不会被打包进最终War文件,避免和外部Tomcat的类加载机制冲突:
如果项目原本使用Undertow、Jetty作为内嵌容器,需要将对应的依赖也改为provided作用域,确保不打进War包,避免类冲突dependencies { // 原有Spring MVC、业务相关依赖全部保留即可 implementation 'org.springframework.boot:spring-boot-starter-web' // 新增:标记内嵌Tomcat为编译/调试阶段可用,不打入War包 providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } - 适配Spring Boot启动类
原有用@SpringBootApplication标注的启动类,需要继承SpringBootServletInitializer并重写configure方法——这是外部Servlet容器(比如Tomcat)加载Spring应用的标准入口;原本用于本地启动的main方法可以完全保留,不影响日常本地调试运行:@SpringBootApplication public class WebApplication extends SpringBootServletInitializer { // 外部Tomcat部署时的应用入口配置 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(WebApplication.class); } // 保留本地调试用的启动方法即可 public static void main(String[] args) { SpringApplication.run(WebApplication.class, args); } }
打包与部署验证
- 执行Gradle命令完成打包,跳过单元测试可以加快构建速度:
gradle clean build -x test - 构建完成后,可部署的War包会输出在项目的
build/libs/目录下,直接将该文件拷贝到独立Tomcat的webapps目录,启动Tomcat即可正常运行 - 需要注意版本兼容:Spring Boot 2.x 系列需要搭配Tomcat 9及以上版本,Spring Boot 3.x 系列需要搭配Tomcat 10及以上版本,避免Servlet规范不兼容导致的启动失败。
内容的提问来源于stack exchange,提问作者Igor Leonardo Pereira da Silva
相关产品推荐
相关产品推荐

