Spring Boot 2 實戰:以 War 包的形式部署

1. 前言

Spring Boot 提供了內置的 tomcatundertowjetty 三種 Servlet Web 容器。讓咱們開箱即用,能夠迅速以 JAR 啓動一個 Web 應用。可是在某些場景中咱們可能還須要將咱們的 Spring Boot 容器以 War 的形式進行傳統的部署。這時咱們就須要經過藉助於 SpringBootServletInitializer 來實現。java

2. SpringBootServletInitializer

SpringBootServletInitializerWebApplicationInitializer 的實現,它從部署在 Web 容器上的傳統 WAR 包運行 Spring Boot 應用。該類將 ServletFilterServletContextInitializer Bean 從應用程序上下文綁定到服務器。SpringBootServletInitializer 類還容許咱們經過覆蓋 SpringApplicationBuilder configure(SpringApplicationBuilder application)方法來配置由 Servlet 容器運行的應用程序。web

3. Spring Boot War 部署

接下來咱們來說述詳細的 Spring Boot War 部署步驟。spring

3.1 修改打包方式爲 War

修改 Spring Boot 項目的 pom.xml 文件將打包方式修改成 warapi

默認打 jar<packaging>jar</packaging> 咱們改成打 war<packaging>war</packaging>

3.2 排除 內嵌的 Web 容器。

默認使用內嵌 Tomcat Web 容器。若是此前你使用了內嵌的 JettyUndertow ,請務必清除相關的 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>

3.3 實現 SpringBootServletInitializer 接口

新建 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);
     }
 
 }

其中 WarSpringBootApplicationSpring 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);
     }
 
 }

3.4 編譯打包

經過 maven 命令 mvn clean package 執行編譯,稍等片刻,就會得到 ${artifactId}-${version}.war ,而後你就能夠以傳統的 War 部署方式運行 Spring Boot 應用了。

4. 總結

整體來講 War 部署 Spring Boot 的方式也並不複雜。若是還有疑惑可參考 DEMO ,DEMO 可經過關注公衆號:Felordcn 回覆 war 來獲取。

關注公衆號:Felordcn 獲取更多資訊

我的博客:https://felord.cn

相關文章
相關標籤/搜索