Spring Boot 项目打成 war 包部署

Spring Boot 一个非常方便的功能就是支持内置的 Servlet 容器,一般我们部署 Spring Boot 应用时都是打成一个可执行的 Jar 包进行部署。其实 Spring Boot 也是支持打成传统的 war 包部署的。肯定有人问:既然 Jar 包简单又方便,为什么还要 用 war 包部署呢?其实我就是自己折腾下,哈哈~

需要注意的是,假如你的应用使用了 Spring 的 WebFlux 功能,那么是不支持 war 包部署的。

配置调整

1. 修改 pom.xml 中的打包方式

<packaging>war</packaging>

2. 调整依赖

<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>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <!-- 该包只在编译和测试的时候使用 -->
    <scope>provided</scope>
</dependency>

3. 继承 SpringBootServletInitializer

@SpringBootApplication
public class AppQuickStart extends SpringBootServletInitializer {

    private static Logger logger = LoggerFactory.getLogger(AppQuickStart.class);

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        logger.info("app begin to start...");
        SpringApplication.run(AppQuickStart.class, args);
        logger.info("app start success...");
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(AppQuickStart.class);
    }
}

4. 一些其他注意点

下面是 build 的配置,主要是设置了应用的名称,还用就是加了 maven-war-plugin 这个插件,不然会报找不到 web.xml 这个错误。

<build>
     <finalName>appName</finalName>
    <!-- 省略其他配置 -->
    <plugins>
        <plugin>
            <configuration>
                <excludeDevtools>true</excludeDevtools>
            </configuration>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

好了,到此就可以执行 mvn clean install 命令打包了。

报 404 问题

网上有很多文章说 Spring Boot 应用打成 war 部署 Tomcat 后访问接口会报 404 错误。如果你是完全上面的步骤配置的不应该会有问题。

假如真的有问题,建议从下面几方面来解决:

  • URL 有没有写对:部署 Tomcat 后是需要填写 context-path 的,这个 context-path 并不是 Spring Boot 中配置的,而是 Tomcat 中配置的,如果你没对 Tomcat 做特殊的配置,那么这个 context-path 就是你打包好的项目的名称;
  • 检查接口参数有没传对;
  • 终极办法,打开日志的 Dubug 级别,一般问题都能看出来,如果你日志是 info 级别,你的全局异常处理没做到位,有些异常是看不出来的。

原文:Spring Boot 项目打成 war 包部署,接口报 404 问题 - 程序员自由之路 - 博客园
作者:程序员自由之路