Maven 将 SpringBoot 项目打成 war 包发布

SpringBoot 项目可以很简单的在本地通过 main 方法启动应用,不用像以前的 web 应用需要集成到容器下才能跑起来。但是有时候因部署环境不同,我们可能需要将 SpringBoot 项目打成 war 包部署。

下面以一个最简单的项目为例,讲解如何配置项目打成 war 包。

这是项目结构,一个 Application 启动类,一个 DemoController 接口类,一个 jquery.js 静态文件,以及 pom.xml 文件。

1576226207505

Application

为了能在容器下运行,我们需要配置 Application 启动类继承 SpringBootServletInitializer,并重写 configure 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.zhangzw.test;

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

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

/** 本地启动 */
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

/** 容器内启动 */
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}

DemoController 接口类

如其他 Controller 一样,没什么不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.zhangzw.test.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

@GetMapping("/demo")
public String demo() {
return "Hello!!!";
}
}

jquery.js

这里用 jquery.js 演示一个静态文件,放到 resources/static 目录下。

pom.xml

pom 文件需要有以下修改:

  1. packaging 设置为:war

  2. 排除 spring-boot-starter-web 的 spring-boot-starter-tomcat 依赖,这些 tomcat 的包在容器里都有的。但是为了本地能跑起来,需要编译期加上这些依赖。

  3. 最后添加 spring-boot-maven-plugin 插件。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.zhangzw</groupId>
<artifactId>test</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.18.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 打成 WAR 包不需要 TOMCAT 内核 -->
<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>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

运行

执行:mvn clean package,打成 war 包后。拷贝到 tomcat 的 webapps 目录下,启动 tomcat,分别访问后台接口和 jquery.js 静态文件看效果:

1576226347654

1576226332900