衡量多种部署方式

Spring Boot应用程序有多种构建和运行方式,其中一些你已经使用过了。

  • 在IDE中运行应用程序(涉及Spring ToolSuite或IntelliJ IDEA)。
  • 使用Maven的spring-boot:run或Gradle的bootRun,在命令行里运行。
  • 使用Maven或Gradle生成可运行的JAR文件,随后在命令行中运行。
  • 使用Spring Boot CLI在命令行中运行Groovy脚本。
  • 使用Spring Boot CLI来生成可运行的JAR文件,随后在命令行中运行。

这些选项每一个都适合运行正在开发的应用程序。但是,如果要将应用程序部署到生产环境 或其他非开发环境中,又该怎么办呢? 虽然这些选项看起来没有一个能将应用部署于非开发环境,但事实上,它们之中只有一个选 项不可用于生产环境——在IDE中运行应用显然不可取。可运行的JAR文件和Spring Boot CLI还是 可以考虑的,两者还可以很好地将应用程序部署到云环境里。 也许你很想知道如何把Spring Boot应用程序部署到一个更加传统的应用服务器环境里,比如 Tomcat、WebSphere或WebLogic。在这些情境中,可执行JAR文件和Groovy代码不适用。针对应 用服务器的部署,你需要将应用程序打包成一个WAR文件。 实际上,Spring Boot应用程序可以用多种方式打包,详见表8-1。

如你所见,在做终选择时需要考虑目标环境。如果要将应用程序部署到自己数据中心的 Tomcat服务器上,WAR文件就是你的选择。另一方面,如果要部署到Cloud Foundry,可以使用 表里列出的各种选项。 本章将关注以下选项。

  • 向Java应用服务器里部署WAR文件。
  • 向Cloud Foundry里部署可执行JAR文件。
  • 向Heroku里部署可执行JAR文件(构建过程是由Heroku执行的)。

探索这些场景的时候,我们还要处理一件事。在开发应用程序时我们使用了嵌入式的H2数 据库,现在得把它替换成生产环境所需的数据库了。 首先,让我们看看如何将阅读列表应用程序构建为WAR文件。这样才能把它部署到Java应用 服务器里,比如Tomcat、WebSphere或WebLogic。

部署到应用服务器

到目前为止,阅读列表应用程序每次运行,Web应用程序都通过内嵌在应用里的Tomcat提供 服务。情况和传统Java Web应用程序正好相反。不是应用程序部署在Tomcat里,而是Tomcat部署 在了应用程序里。 归功于Spring Boot的自动配置功能,我们不需要创建web.xml文件或者Servlet初始化类来声明Spring MVC的DispatcherServlet。但如果要将应用程序部署到Java应用服务器里,我们就需 要构建WAR文件了。这样应用服务器才能知道如何运行应用程序。那个WAR文件里还需要一个 对Servlet进行初始化的东西。

构建WAR文件 实际上,构建WAR文件并不困难。如果你使用Gradle来构建应用程序,只需应用WAR插件 即可:
apply plugin: 'war' 随后,在build.gradle里用以下war配置替换原来的jar配置:
war { baseName = 'readinglist' version = '0.0.1-SNAPSHOT' } 两者的唯一区别就是 j 换成了w。

如果使用Maven构建项目,获取WAR文件会更容易。只需把<packaging>元素的值从jar 改为war。

<packaging>war</packaging> 

这样就能生成WAR文件了。

但如果WAR文件里没有启用Spring MVC DispatcherServlet 的web.xml文件或者Servlet初始化类,这个WAR文件就一无是处。 此时就该Spring Boot出马了。它提供的SpringBootServletInitializer是一个支持 Spring Boot的Spring WebApplicationInitializer实现。除了配置Spring的Dispatcher- Servlet,SpringBootServletInitializer还会在Spring应用程序上下文里查找Filter、 Servlet或ServletContextInitializer类型的Bean,把它们绑定到Servlet容器里。 要使用SpringBootServletInitializer,只需创建一个子类,覆盖configure()方法 来指定Spring配置类。代码清单8-1是ReadingListServletInitializer,也就是我们为阅读列表应用程序写的SpringBootServletInitializer的子类。

package com.dxz.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer; public class ReadingListServletInitializer extends SpringBootServletInitializer { @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class); //指定spring配置
} }

如你所见,configure()方法传入了一个SpringApplicationBuilder参数,并将其作为 结果返回。期间它调用sources()方法注册了一个Spring配置类。本例只注册了一个 Application类。回想一下,这个类既是启动类(带有main()方法),也是一个Spring配置类。
虽然阅读列表应用程序里还有其他Spring配置类,但没有必要在这里把它们全部注册进来。 Application类上添加了@SpringBootApplication注解。这会隐性开启组件扫描,而组件扫 描则会发现并应用其他配置类。 现在我们可以构建应用程序了。如果使用Gradle,你只需调用build任务即可:
$ gradle build 没问题的话,你可以在build/libs里看到一个名为readinglist-0.0.1-SNAPSHOT.war的文件。 对于基于Maven的项目,可以使用package:
$ mvn package 成功构建之后,你可以在target目录里找到WAR文件。 剩下的工作就是部署应用程序了。应用服务器不同,部署过程会有所区别,因此请参考应用 服务器的部署说明文档。

对于Tomcat而言,可以把WAR文件复制到Tomcat的webapps目录里。如果Tomcat正在运行(要 是没有运行,则在下次启动时检测),则会检测到WAR文件,解压并进行安装。 假设你没有在部署前重命名WAR文件, Servlet上下文路径会与WAR文件的主文件名相同, 在本例中是/demo-0.0.1-SNAPSHOT。用你的浏览器打开http://server:port/demo-0.0.1-SNAPSHOT就能访问应用程序了。

还有一点值得注意:就算我们在构建的是WAR文件,这个文件仍旧可以脱离应用服务器直 接运行。如果你没有删除Application里的main()方法,构建过程生成的WAR文件仍可直接运 行,一如可执行的JAR文件:

E:\myspace\demo\target>java -jar demo-0.0.1-SNAPSHOT.war

SpringBoot之二:部署Spring Boot应用程序方式的更多相关文章

  1. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  2. Springboot监控之二:Spring Boot Admin对Springboot服务进行监控

    概述 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖后, Spring Boot 会默认配置一些通用的监控,比如 jvm 监控.类加载.健 ...

  3. springboot(十六):使用Jenkins部署Spring Boot

    jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署分为三个步骤: 第一步,jenkins安装 第二步,插件安装和配置 第 ...

  4. docker 部署Spring Boot:Docker化Spring Boot应用程序

    第一章 1.创建项目存放目录 mkdir /root/sproot -p 2.准备好Spring Boot应用程序 jar 包 testrest.jar 第二章 1. 安装docker 在所有节点执行 ...

  5. 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)

    部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...

  6. 使用 Docker 部署 Spring Boot 项目,带劲!!

    上一篇:年轻人的第一个 Docker 应用 Docker 一次构建.处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程 ...

  7. 从零部署Spring boot项目到云服务器(正式部署)

    上一篇文章总结了在Linux云服务器上部署Spring Boot项目的准备过程,包括环境的安装配置,项目的打包上传等. 链接在这里:http://www.cnblogs.com/Lovebugs/p/ ...

  8. Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

    Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ...

  9. Spring Boot 2 (四):使用 Docker 部署 Spring Boot

    Spring Boot 2 (四):使用 Docker 部署 Spring Boot Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常 ...

随机推荐

  1. python爬虫-韩寒新浪博客博文

    博客地址:http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html 爬第一页博文 #-*-coding:utf--*- import re # ...

  2. web容器调用Filter和Servlet顺序学习

    web容器调用Filter和Servlet顺序学习    一直对Filter和Servlet在哪里被web容器调用迷惑,后查看tomcat源码,揭开了其面纱.1. 下面是一个简单的时序图: 2. 对上 ...

  3. pandas通过字典生成dataframe

    1.将一个字典输入: 该字典必须满足:value是一个list类型的元素,且每一个key对应的value长度都相同: (以该字典的key为columns) >>> import pa ...

  4. $.ajax应用之请求头headers

    昨天项目中,由于要请求token验证,后台给出的方案是采用请求头返回token数据,给出的API文档是这样的 由于之前一直都是采用请求体发送请求,服务器在应答体李返回数据.和这个不一样: 采用jq的$ ...

  5. Explain分析查询语句

    ​表的读取顺序 读取操作的类型 可用索引,实际使用的索引 表之间的引用 每张表多少行被优化器查询 索引的长度 EXPLAIN字段解释: ØTable:显示这一行的数据是关于哪张表的 Øpossible ...

  6. Servlet细节处理

    1.Servlet的线程安全问题 尽管servlet的工作效率高,但是线程也是不安全的,因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求 解决方案:所 ...

  7. 未定义的标示符“RECT”,引入了windows.h头文件也没有用?

    我用的是win8的vs2012,RECT应该引入什么头文件?windows.h我第一个就引入了,去windows.h里面搜也搜不到RECT这个关键字,应该引入哪个头文件呢? 真是奇怪啊,是不是还需要什 ...

  8. OpenCV - Android Studio 2.2 中利用CAMKE进行OpenCV的NDK开发

    我在http://www.cnblogs.com/fx-blog/p/8206737.html一文中提到了如何在Android Studio中Java层导入OpenCV(包含opencv_contri ...

  9. JSON格式规范总结

    JSON有三类元素: 1.结构体(关键字:大括号)2.键值对(关键字:冒号)3.数组(关键字:中括号) 组织规则:结构体中放一个或者多个键值对.键只能是字符串.值可以是:字符串.数字.null.tru ...

  10. UVA 11637 Garbage Remembering Exam

    #include <iostream> #include <stdio.h> #include <cstring> #include <math.h> ...