Spring Boot 提供了內置的 tomcat
、undertow
、jetty
三種 Servlet Web 容器。讓咱們開箱即用,能夠迅速以 JAR 啓動一個 Web 應用。可是在某些場景中咱們可能還須要將咱們的 Spring Boot 容器以 War 的形式進行傳統的部署。這時咱們就須要經過藉助於 SpringBootServletInitializer
來實現。java
SpringBootServletInitializer
是 WebApplicationInitializer
的實現,它從部署在 Web 容器上的傳統 WAR 包運行 Spring Boot 應用。該類將 Servlet,Filter 和 ServletContextInitializer Bean 從應用程序上下文綁定到服務器。SpringBootServletInitializer
類還容許咱們經過覆蓋 SpringApplicationBuilder configure(SpringApplicationBuilder application)
方法來配置由 Servlet 容器運行的應用程序。web
接下來咱們來說述詳細的 Spring Boot War 部署步驟。spring
修改 Spring Boot 項目的 pom.xml
文件將打包方式修改成 war
。api
默認打jar
包<packaging>jar</packaging>
咱們改成打war
包<packaging>war</packaging>
默認使用內嵌 Tomcat Web 容器。若是此前你使用了內嵌的 Jetty、Undertow ,請務必清除相關的 Starter 依賴。而後咱們可使用兩種方式來處理:tomcat
Spring Boot 內嵌的Tomcat
默認已經集成在spring-boot-starter-web
包裏,因此咱們要排除掉它。服務器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
此方式咱們把 Servlet Api 依賴也排除掉了, SpringBootServletInitializer
須要依賴 Servlet Api ,所以咱們要加上它(務必注意 versionNumber 版本要跟你外置的 Tomcat 版本兼容)。app
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${versionNumber}</version> <scope>provided</scope> </dependency>
咱們經過引入 spring-boot-starter-tomcat
覆蓋掉默認的內置 Tomcat 並設置做用範圍(scope
)是provided
(編譯、測試)。maven
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
新建 SpringBootServletInitializer
的實現類 ServletInitializer
以下:ide
package cn.felord.war; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; /** * @author Felordcn */ public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(WarSpringBootApplication.class); } }
其中 WarSpringBootApplication
是 Spring Boot 的入口類,跟原來沒什麼兩樣:spring-boot
package cn.felord.war; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Felordcn */ @SpringBootApplication public class WarSpringBootApplication { public static void main(String[] args) { SpringApplication.run(WarSpringBootApplication.class, args); } }
經過 maven 命令 mvn clean package
執行編譯,稍等片刻,就會得到 ${artifactId}-${version}.war
,而後你就能夠以傳統的 War 部署方式運行 Spring Boot 應用了。
整體來講 War 部署 Spring Boot 的方式也並不複雜。若是還有疑惑可參考 DEMO ,DEMO 可經過關注公衆號:Felordcn 回覆 war 來獲取。
關注公衆號:Felordcn 獲取更多資訊