Gradle构建WAR包核心三步:启用war插件(低版本用apply plugin:'war',高版本用plugins{id'war'})、创建src/main/webapp目录并放置Web资源、Servlet API依赖设为compileOnly或providedCompile。

Gradle Java项目构建WAR包,核心就三件事:加war插件、配好src/main/webapp路径、确保Servlet容器依赖是provided作用域——缺一不可,否则部署后404或启动失败。
必须启用war插件并确认插件写法
低版本Gradle(6.x及以前)用apply plugin: 'war';高版本(7.0+)必须改用plugins { id 'war' },否则gradle war任务根本不会注册。别只看build脚本能跑通就以为对了——检查终端执行gradle tasks,确认输出里有war和bootWar(如果是Spring Boot)。
-
plugins块必须放在build.gradle最顶部,不能嵌套在subprojects或allprojects里 - 如果同时用
java插件,顺序无关,但war插件会自动依赖java - 别漏掉
sourceCompatibility = JavaVersion.VERSION_17这类声明,否则编译可能失败
src/main/webapp目录必须存在且被war任务识别
Gradle的war插件默认只打包src/main/webapp下的内容(含WEB-INF/web.xml),不读src/main/resources里的静态文件。如果你没这个目录,或者放错了位置(比如建成了src/webapp),生成的WAR里就没有HTML/CSS/JS,访问直接404。
- 手动创建
src/main/webapp/WEB-INF/web.xml(哪怕空文件也行,Spring Boot可省略,但传统Web项目必须) - 静态资源(如
index.html)必须放在src/main/webapp/下,不是resources - 需要额外路径?用
war { from 'xxx' }显式追加,例如from 'src/dist' into 'static'
Servlet API依赖必须设为providedCompile或compileOnly
Tomcat等容器自身提供javax.servlet或jakarta.servlet类,如果把它们打进WAR,运行时大概率报java.lang.ClassCastException: javax.servlet.Filter或ClassNotFoundException——因为类加载器冲突。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- Spring Boot项目:把
spring-boot-starter-tomcat改为providedRuntime(Gradle 7+)或providedCompile(旧版) - 传统Java Web项目:用
compileOnly 'jakarta.servlet:jakarta.servlet-api:6.0.0'(Jakarta EE 9+)或compileOnly 'javax.servlet:javax.servlet-api:4.0.1'(旧版) - 别用
implementation或runtimeOnly,那会把API打进WAR
Spring Boot项目额外要继承SpringBootServletInitializer
Spring Boot默认打jar,靠内嵌Tomcat启动;打war部署到外部容器时,必须让主启动类继承SpringBootServletInitializer并重写configure(),否则Spring MVC的DispatcherServlet根本不会注册,所有请求都返回404。
- 主类加
@SpringBootApplication,再extends SpringBootServletInitializer -
configure()方法里调用builder.sources(YourApplication.class),别传错Class对象 - Gradle里还要确保
bootWar任务被触发(不是war),否则打包逻辑不走Spring Boot定制流程
最容易忽略的是:你以为gradle build生成了WAR,其实它默认只跑jar任务;得明确执行gradle bootWar(Spring Boot)或gradle war(传统项目),而且得去build/libs/找文件,不是build/根目录。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










