SpringBoot 开发一个可以在 Web 容器中运行的 War 程序

前言

前面的文章的 web 程序的样例都是一个个独立运行的 jar 包的形式。这种方式使用起来很方便,但是也有时候有需求要将 SpringBoot 开发的 web 程序放到一个 web 容器例如 Tomcat 中去运行。这个时候就需要将 SpringBoot 程序给打包成一个标准的 war 包文件才行。怎么做呢,其实也很简单,下面我们来演示一下。

创建标准 SpringBoot web 项目

根据前面的文章,我们在 IDEA 里面创建一个标准的 SpringBoot 程序,他的 Maven 配置文件 pom.xml 内容如下



    4.0.0

    com.yanggaochao.demo
    war_demo
    0.0.1-SNAPSHOT
    jar

    war_demo
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.0.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


然后我们编写一个 Rest 服务接口如下

package com.yanggaochao.demo.war;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Hello 服务
 *
 * @author : 杨高超
 * @since : 2018-11-20
 */
@RestController
@RequestMapping("/api/v1/hello")
public class HelloService {
    @RequestMapping(value = "/echo/{name}", method = RequestMethod.GET)
    public String sayHello(@PathVariable String name) {
        return "Hello," + name;

    }
}

然后,我们配置 application.propertis 内容如下

server.servlet.context-path=/spring_boot_war
server.port=3333

运行主程序。那么在浏览器中输入地址 http://localhost:3333/spring_boot_war/api/v1/hello/echo/yanggch 就会在页面上显示 Hello,yanggch 的文本。

这就是一个标准的 SpringBoot Web 程序了。下面我们要把他改造成为一个可以打包为标准的 war 包文件,放到 Java Web 容器中运行的程序。

改造为 War 包程序

首先,我们要修改我们的启动类,让他继承一个 org.springframework.boot.web.servlet.support.SpringBootServletInitializer 类并且改写 config 方法。修改后的启动类变成

package com.yanggaochao.demo.war;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * War 样例
 *
 * @author : 杨高超
 * @since : 2018-11-20
 */
@SpringBootApplication
public class WarApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(WarApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WarApplication.class);
    }
}

然后修改我们的 Maven 文件如下



    4.0.0

    com.yanggaochao.demo
    war
    0.0.1-SNAPSHOT
    war

    war
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.0.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        spring_boot_war
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    




这里有两个改动,一个是 war 的值由 jar 改变为了 war。第二个是在 标签下增加了一个 spring_boot_war 。这是因为当打包为 war 以后, application.properties 文件就失效了,tomcat 中的 war 包的 context_path 默认和 war 包的文件名一致,而这个程序默认的 war 包名称讲师 war_demo-0.0.1-SNAPSHOT.jar 。这个显然不太友好,所以我们增加 spring_boot_war 配置让生成的 war 包和我们预想的 context_path 保持一致。然后,执行 mvn package 得到 target/spring_boot_war.war 文件。最后将这个文件放到 tomcat 的 webapps 目录下启动 tomcat。启动完成后在浏览器中输入 http://localhost:8080/spring_boot_war/api/v1/hello/echo/yanggch 。页面上同样会出现 Hello,yanggch 文本。这就表示我们的程序正确的以 War 包的形式发布到 Tomcat 中了。

你可能感兴趣的:(SpringBoot 开发一个可以在 Web 容器中运行的 War 程序)