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
包咱們改成打
jar war
包tomcat
war
默認使用內嵌 Tomcat Web 容器。若是此前你使用了內嵌的 Jetty、Undertow ,請務必清除相關的 Starter 依賴。而後咱們可使用兩種方式來處理:服務器
Spring Boot 內嵌的Tomcat
默認已經集成在spring-boot-starter-web
包裏,因此咱們要排除掉它。app
<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 版本兼容)。maven
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${versionNumber}</version>
<scope>provided</scope>
</dependency>複製代碼
咱們經過引入 spring-boot-starter-tomcat
覆蓋掉默認的內置 Tomcat 並設置做用範圍(scope
)是provided
(編譯、測試)。ide
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency> 複製代碼
新建 SpringBootServletInitializer
的實現類 ServletInitializer
以下:spring-boot
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 的入口類,跟原來沒什麼兩樣:
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獲取更多資訊