衡量多种部署方式

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 {@Overrideprotected 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. aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

    aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialise ...

  2. 如何在AWS EC2实例上部署Spring Boot应用程序

    你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialiser创建一个Spring ...

  3. 在Amazon Elastic Beanstalk上部署Spring Boot应用程序

    在此博客中,我们将看到如何在Amazon ElasticBeanstalk上部署Spring Boot应用程序. Amazon ElasticBeanstalk具有一个预配置的Java环境,可用于部署 ...

  4. Spring Boot应用程序的“本地服务”

    我有机会尝试使用Knative的 Serving功能来部署Spring Boot应用程序,而这篇文章只是记录了示例和我采用的方法. 我对Knative的内部知识还不够了解,无法就此方法是否比基于部署 ...

  5. owin 怎么部署在云中_使用Boxfuse轻松在云中运行Spring Boot应用程序

    owin 怎么部署在云中 几天前,我开始构建一个将使用REST API检索和存储数据的iOS应用. 该REST API将是我也必须构建的服务器应用程序. 由于我熟悉Java和Spring ,因此决定使 ...

  6. 将Spring Boot应用程序部署到Tomcat中

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 部署应用 ...

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

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

  8. azure不支持java1.9_java – 无法将Spring Boot应用程序部署到Azure

    我无法让我的Spring Boot站点在Azure Web实例上做出响应.我已经关注了Java app instructions和upload instructions.似乎IIS服务器正在接收请求, ...

  9. springboot 微服务_使用 Docker 部署 Spring Boot微服务

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

最新文章

  1. JsonHelper
  2. linux的grup文件,Linux /boot/grub/grub.conf(GRUB配置文件)内容详解
  3. Aria2 使用手札
  4. spring aop记录日志方案设计
  5. Shiro与Springboot整合:配置依赖改造登录方法
  6. php时间格式函数,PHP函数之日期时间函数date()使用详解_php基础_脚本
  7. Awesome Bioinformatics:假期了,收藏学习吧!
  8. mysql重新编译_重新编译mysqld_exporter0.10-阿里云开发者社区
  9. python type error是什么意思_Python-TypeError:“ int”对象不可调用
  10. 翁恺老师C语言学习笔记(十)指针_指针的使用
  11. 数据分析汇报用这个神器,让他们弃用了Excel和PPT
  12. python descibe_Pandas python .describe()格式化/输出
  13. 数据库管理学习笔记(一)——实体关系建模
  14. 机器学习基础(三十七) —— 处理类别特征
  15. VUE ---- 利用vue-print-nb实现打印功能
  16. 在树莓派2上安装 Windows 10
  17. 关于RDP报表工具参数配置
  18. ICMP协议解析与实战
  19. 利用MATLAB解特征方程,并画出特征根的分布,便于分析系统的稳定性
  20. 【每日新闻】倪光南:“中国芯”切勿重硬轻软;美国研发出可直接在皮肤上打印的3D打印技术...

热门文章

  1. 3.6-fdisk命令
  2. [Android] 环境配置之Android Studio开发NDK
  3. 访问IIS元数据库失败解决方法(转)
  4. C#里面比较时间大小三种方法
  5. linux script $,linux的script命令
  6. @Autowired使用
  7. java 如何对由json对象构成的数组形式的字符串进行遍历?
  8. Spring AOP的一个简单实现
  9. Docker入门简介
  10. VMware Network Adapter VMnet1和VMnet8 未识别的网络的解决方法