背景
Spring Boot可以很方便地通过可运行Jar包的形式,在Spring Boot内嵌容器中运行Web应用,但在生产部署过程中,往往需要将Web应用部署在外部的容器中。为此,需要将Spring Boot的Web应用打包为War包进行部署。
本文根据Spring Boot官方指导文档,实现为Tomcat打包War包,并在外部Tomcat中成功运行。
工程结构
配置POM文件
在Web应用基础上增加如下配置
<!-- 声明Maven打包为War包 -->
<packaging>war</packaging>
<dependencies>
<!-- 引入Web应用所需依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 默认加载tomcat依赖,如不需要须显式剔除 -->
<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>
</dependencies>
创建Spring Boot启动类
Spring Boot启动类保持不变
package com.q.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName: MySpringBootApplication
* @Description: SpringBoot主入口
* @author: ZQ
* @date: 2016年9月5日 下午1:48:00
*/
//@PropertySource(value = { "WEB-INF/custom.properties" })
@SpringBootApplication
//SpringBoot入口,与以下组合等效
//@Configuration -- 注明为配置类
//@EnableAutoConfiguration -- 开启自动配置
//@ComponentScan -- 以当前包路径为根,开启组件扫描
public class MySpringBootApplication
{
/**
* @Title: main
* @Description: SpringBoot默认的Jar启动模式,直接Run即可运行,默认监听8080端口
* @param args
* @throws Exception
* @return: void
* @author:ZQ
* @date:2016年8月25日 下午1:58:25
*/
public static void main(String[] args) throws Exception
{
SpringApplication.run(MySpringBootApplication.class, args);
}
}
创建Spring Boot的Servlet初始化器
package com.q.springboot.common;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import com.q.springboot.MySpringBootApplication;
/**
* @ClassName: ServletInitializer
* @Description: 打包为可部署War包时,Servlet3.0容器使用该类作为初始化器,是整个Web应用的主入口
* @author: ZQ
* @date: 2016年9月2日 下午5:34:25
*/
public class ServletInitializer extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure
(SpringApplicationBuilder builder)
{
// 指向SpringBoot的主入口
return builder.sources(MySpringBootApplication.class);
}
}
创建测试用Controller
package com.q.springboot.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: SampleController
* @Description: 定义一个测试用的Rest接口
* @author: ZQ
* @date: 2016年9月7日 下午5:28:50
*/
@RestController
public class SampleController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}
特别提示
上述方法打包的War包只能在Servlet 3.0及以上容器中运行,Servlet 3.0之后可以使用注释定义Servlet和Filter,无需在web部署描述符(web.xml)中建立Servlet/Filter配置。
tomcat7.0以上版本支持Servlet 3.0。
Spring Boot也可以添加web.xml配置文件以便在Servlet 3.0之前的容器中运行,官方指导文档中没有给出web.xml具体的配置方法,此处待后续实现后补充。
Servlet 3.0之前版本War包的一般结构如下
└── META-INFO
└── WEB-INFO
└── lib #一些依赖的jar包
└── classes #classpath目录
└── web.xml
└── 其它配置文件、属性文件等
└── 其它资源文件
代码下载地址
http://download.csdn.net/detail/jianghai0297/9625007
开发环境
本文示例代码在以下版本的64位环境中测试通过
- JDK 1.8.0_11
- Maven 3.2.1
- Eclipse 4.4.2
- Tomcat 7.0.42