deploy spring-boot as war file

spring-boot 非常方便, 用来验证程序非常快速. 但如果基于spring-boot写了一个应用, 怎么部署呢 ?

spring-boot 打包有两种, 一种继续使用jar, 使用内置的web容器; 另一种使用war, 部署到已有的web容器中.

下面介绍war方式部署:

pom.xml 修改


首先把打包类型修改为: <packaging>war</packaging>

接着修改spring-boot-starter-tomcatprovided的scope, 避免打包到war中:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>
  • 注意:

boot-start版本要高于1.3, 否则使用tomcat启动会出现异常.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>

部署到 Servlet 3.0 规范的容器


如果你的web容器支持Servlet 3.0规范, 可以使用以下的方法:

首先继承SpringBootServletInitializer, 并覆写configure方法, 不需要web.xml.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
// Customize the application or call application.sources(...) to add sources
// Since our example is itself a @Configuration class we actually don't
// need to override this method.
return application.sources(SampleControllerAndApp.class);
}

}

部署到旧的容器 (Servlet 2.5)

如果你的容器不支持servlet 3.0规范怎么办 ? 下面是一个解决方法:

  • 1
    增加一个org.springframework.boot:spring-boot-legacy依赖

  • 2
    创建web.xml, 用以声明context listener, 这个listener是org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener, 是在spring-boot下特别使用的, 其他配置和正常spring应用一样. web.xml 如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>demo.Application</param-value>
</context-param>

<listener>
<listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>metricFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>metricFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

参考


howto-create-a-deployable-war-file
http://docs.spring.io/spring-boot/docs/current/maven-plugin/
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging