如何将Gradle构建的Spring Boot Web服务改为生成WAR文件而非JAR文件
将Spring Boot + Gradle项目改为生成WAR包的完整步骤
嗨,刚好我之前折腾过这个配置,给你一步步拆解怎么改,完全适配你要搭建动态Web项目、整合UI和部署到外部Web容器的需求~
1. 调整build.gradle核心配置
首先要在构建脚本里添加war插件,同时保留Spring Boot的核心插件:
plugins { id 'org.springframework.boot' version '你的Spring Boot版本号' id 'io.spring.dependency-management' version '对应依赖管理版本' id 'java' id 'war' // 新增这个插件,开启WAR打包能力 }
接下来处理内嵌容器的依赖——Spring Boot默认内嵌Tomcat,如果你打算把WAR部署到外部容器(比如Tomcat、Jetty),需要把内嵌Tomcat标记为providedRuntime,这样打包时不会把它放进WAR包(避免和外部容器冲突):
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' // 把内嵌Tomcat设为仅运行时提供,打包时排除 providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' // 你的其他业务依赖保持不变即可 }
如果你的项目需要兼容老版本Servlet容器(比如需要web.xml),可以在src/main/webapp/WEB-INF目录下添加自定义的web.xml,不过现在大部分场景下Spring Boot的无XML配置已经足够用了。
2. 修改Spring Boot主类
默认的Spring Boot主类只需要继承SpringBootServletInitializer,并重写configure方法,这样外部容器才能正确识别并加载你的Spring应用:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class YourApplication extends SpringBootServletInitializer { // 重写configure方法,指定应用入口类 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } // 保留main方法,这样依然可以用bootRun直接启动内嵌容器调试 public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
这个改动很关键——既保留了本地用./gradlew bootRun快速调试的能力,又能生成可以部署到外部容器的WAR包。
3. 生成WAR包
最后执行Gradle的war任务就行:
./gradlew war
生成的WAR文件会放在build/libs目录下,文件名格式一般是你的项目名-版本号.war。如果需要生成可执行WAR(既可以直接java -jar运行,又能部署到容器),可以不用排除内嵌Tomcat依赖,但部署到外部容器时还是建议排除,避免类冲突。
内容的提问来源于stack exchange,提问作者Puneet Dewan
相关产品推荐
相关产品推荐

