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

相关文章
相关标签/搜索