Spring Boot 實現以 War 包的形式部署

1. 說明

Spring Boot 提供了內置的 tomcat、undertow、jetty 三種 Servlet Web 容器。讓我們開箱即用,可以迅速以 Jar方式 啓動一個 Web 應用。但是在某些場景中我們可能還需要將我們的 Spring Boot 容器以 War 包的形式進行傳統的部署。這時我們就需要通過藉助於 SpringBootServletInitializer 來實現。

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

2. Spring Boot War 部署

接下來我們來講述詳細的 Spring Boot War 部署步驟。

2.1 修改打包方式爲 War

修改 Spring Boot 項目的 pom.xml 文件將打包方式修改爲 war 。

默認打 jar 包 <packaging>jar</packaging>  改爲打 war 包 <packaging>war</packaging>

2.2 排除 內嵌的 Web 容器

默認使用內嵌 Tomcat Web 容器。如果此前你使用了內嵌的 Jetty、Undertow ,請務必清除相關的 Starter 依賴。然後我們可以使用兩種方式來處理:

方法一:
Spring Boot 內嵌的Tomcat默認已經集成在spring-boot-starter-web包裏,所以我們要排除掉它。
修改pom.xml配置文件: 

排除spring-boot-starter-tomcat依賴

<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>
SpringBootServletInitializer 需要依賴 Servlet Api ,因此要加上它(另請注意 versionNumber 版本要跟你外置的 Tomcat 版本兼容)。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>${versionNumber}</version> 
    <scope>provided</scope> 
</dependency>

方法二
我們通過引入 spring-boot-starter-tomcat 覆蓋掉默認的內置 Tomcat 並設置作用範圍(scope)是provided(編譯、測試)。
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <scope>provided</scope>
 </dependency>

2.3 實現 SpringBootServletInitializer 接口

方法一:

Application.java

Application繼承SpringBootServletInitializer

public class Application extends SpringBootServletInitializer {
    // todo:
}

方法二:
新建 SpringBootServletInitializer 的實現類 ServletInitializer 如下:

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

2.4 編譯打包
通過 maven 命令 mvn clean package 執行編譯,稍等片刻,就會獲得 爲${artifactId}-${version}設定的war包文件 ,然後你就可以以傳統的 War 部署方式運行 Spring Boot 應用了。

3..啓動Tomcat

進入Tomcat中bin目錄,雙擊startup.bat

若想按服務方式運行:進入到bin文件夾。按下shift+右擊打開命令窗口,輸入service.bat install service_name就可以安裝服務,service_name就是給服務起的名字,可以自己命名,這邊的名字是tomcat8

上圖界面代表啓動成功,成功後不要關閉,否則就關掉了Tomcat。

測試Tomcat是否啓動成功:
在瀏覽器地址欄輸入http://localhost:8080/

4. 部署到生產環境

將你編譯好的War包文件拷貝到Tomcat的安裝目錄的webapps下,若包名是test.war,則在地址欄裏輸入localhost:8080/test,就可以正常訪問系統了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章