【小QのSpringBoot】打包可部署的War包

背景

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值