Spring Boot 2.0 支持热部署,实现方法很简单

Spring Boot 2.0 有几种热重载的选项。 推荐的方法是使用spring-boot-devtools

因为它提供了额外的开发时间功能,例如支持快速应用程序重启和LiveReload以及合理的开发时配置(如模板缓存)。 Devtools通过监视类路径的变化来工作。 这意味着静态资源更改必须“建立”,以使更改生效。 默认情况下,当您保存更改时,这会在Eclipse中自动发生。 在IntelliJ IDEA中,Make Project命令触发必要的构建。 由于默认的重新启动排除,对静态资源的更改不会触发应用程序的重新启动。 但是,他们确实会触发实时重新加载。

1. 静态资源热部署

如果使用的  Thymeleaf  模板,那么请直接在application.properties中添加

spring.thymeleaf.cache=false

如果使用的 FreeMarker 模板,那么请直接在application.properties中添加

spring.freemarker.cache=false

如果使用的 Groovy 模板,那么请直接在application.properties 中添加

spring.groovy.template.cache=false

2. spring-boot-devtools java热部署配置

spring-boot-devtools模块包含对自动应用程序重新启动的支持。

虽然速度不如JRebel这样的技术,但它通常比“冷启动”快得多。

使用方式:

添加Maven依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

添加Gradle依赖

dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}

总结:

如果使用war方式部署的话,修改了java文件,那么必须重启tomcat.

如果使用jar方式部署,

  • Eclipse中保存即可热部署
  • Ideal Indea 需要rebuild project

最常用配置:

# 是否使用模板缓存
spring.thymeleaf.cache=false
#spring.freemarker.cache=false
#spring.groovy.template.cache=false
#如果不想使用重启功能,可以使用spring.devtools.restart.enabled属性来禁用它
spring.devtools.restart.enabled=true
#与LiveReload一起使用时,自动重启的效果非常好。
spring.devtools.livereload.enabled=true
#配置监视其他路径的更改
spring.devtools.restart.additional-paths=src/main/java
#仅排除/static你将设置以下内容:
spring.devtools.restart.exclude=static/**

3. spring-boot-devtools 热部署使用

3.1 properties 默认值

spring-boot-devtools模块会自动应用合理的开发时配置,不需要手动配置。

DevToolsPropertyDefaultsPostProcessor

    static {
Map<String, Object> devToolsProperties = new HashMap<>();
devToolsProperties.put("spring.thymeleaf.cache", "false");
devToolsProperties.put("spring.freemarker.cache", "false");
devToolsProperties.put("spring.groovy.template.cache", "false");
devToolsProperties.put("spring.mustache.cache", "false");
devToolsProperties.put("server.servlet.session.persistent", "true");
devToolsProperties.put("spring.h2.console.enabled", "true");
devToolsProperties.put("spring.resources.cache.period", "0");
devToolsProperties.put("spring.resources.chain.cache", "false");
devToolsProperties.put("spring.template.provider.cache", "false");
devToolsProperties.put("spring.mvc.log-resolved-exception", "true");
devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true");
devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true");
PROPERTIES = Collections.unmodifiableMap(devToolsProperties);
}

3.2 自动重启

每当类路径上的文件发生更改时,使用spring-boot-devtools的应用程序都会自动重新启动。在IDE中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。 默认情况下,监视指向文件夹的类路径中的任何条目以进行更改。 请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。

默认仅排除/ static和/ public,您将设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

Tips; 如果希望保留这些默认值并添加其他排除项,请改用spring.devtools.restart.additional-exclude属性

3.2.1 触发重启

由于DevTools监控类路径资源,触发重启的唯一方法是更新类路径。 导致类路径更新的方式取决于您使用的IDE。

在Eclipse中,保存修改后的文件会导致更新类路径并触发重新启动。

在IntelliJ IDEA中,构建项目(Build - > Build Project)具有相同的效果。

3.2.2 LiveReload 一起使用

与LiveReload一起使用时,自动重启的效果非常好。

如果使用JRebel,则禁用自动重新启动,以支持动态类重新加载。 其他devtools功能(例如LiveReload和属性覆盖)仍然可以使用。

在application.properties添加如下配置

spring.devtools.livereload.enabled=true
  • 一次只能运行一个LiveReload服务器。 在开始应用程序之前,请确保没有其他LiveReload服务器正在运行。 如果您从IDE启动多个应用程序,则只有第一个应用程序支持LiveReload。
  • DevTools依靠应用程序上下文的关闭挂钩在重新启动期间关闭它。 如果您禁用了关闭挂钩(SpringApplication.setRegisterShutdownHook(false)),它将无法正常工作。
  • 在决定类路径中的条目是否会在更改时触发重新启动时,DevTools会自动忽略名为spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的项目。
  • DevTools需要自定义ApplicationContext使用的ResourceLoader。 如果你的应用程序已经提供了一个,它将被包装。 不支持直接覆盖ApplicationContext上的getResource方法。

重新启动vs重新加载

Spring Boot提供的重启技术通过使用两个类加载器来工作。 不会更改的类(例如,来自第三方jar的类)将加载到基类加载器中。 您正在开发的类会加载到重启类加载器中。 当应用程序重新启动时,重启类加载器被丢弃并创建一个新类。 这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为基类加载器已经可用并且已被填充。

如果您发现重启对于您的应用程序来说不够快,或者遇到类加载问题,则可以考虑从ZeroTurnaround中重新加载技术,例如JRebel。 这些工作通过重写类,因为它们被加载,使它们更容易重新加载。

3.3 记录条件评估中的更改

默认情况下,每次应用程序重新启动时,都会记录显示条件评估增量的报告。 该报告显示了在您进行更改(如添加或删除Bean以及设置配置属性)时对应用程序自动配置的更改。

要禁用报告的日志记录,请设置以下属性:

spring.devtools.restart.log-condition-evaluation-delta=false

3.4 排除资源

某些资源不一定需要在更改时触发重新启动。 例如,可以就地编辑Thymeleaf模板。 默认情况下,更改/ META-INF / maven,/ META-INF / resources,/ resources,/ static,/ public或/ templates中的资源不会触发重新启动,但会触发实时重新加载。 如果你想自定义这些排除,你可以使用spring.devtools.restart.exclude属性。 例如,要仅排除/ static和/ public,您将设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

Tips: 如果要保留这些默认值并添加其他排除项,请改为使用spring.devtools.restart.additional-exclude属性。

3.5 看额外的路径

您可能希望在更改不在类路径中的文件时重新启动或重新加载应用程序。 为此,请使用spring.devtools.restart.additional-paths属性来配置其他路径以监视更改。 您可以使用前面介绍的spring.devtools.restart.exclude属性来控制其他路径下的更改是触发完全重新启动还是实时重新加载。

#配置监视其他路径的更改
spring.devtools.restart.additional-paths=src/main/java

3.6 禁用重新启动

如果您不想使用重新启动功能,则可以使用spring.devtools.restart.enabled属性将其禁用。

在大多数情况下,您可以在application.properties中设置此属性(这样做仍会初始化重新启动类加载器,但它不会监视文件更改)。

如果需要完全禁用重新启动支持(例如,因为它不适用于特定库),则在调用SpringApplication.run(...)之前,需要将spring.devtools.restart.enabled System属性设置为false,如 如下例所示:

public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);

3.7 使用触发文件

如果您使用持续编译更改文件的IDE,则可能只希望在特定时间触发重新启动。 为此,您可以使用“触发文件”,这是一个特殊文件,当您想要实际触发重新启动检查时必须对其进行修改。 只更改文件会触发检查,只有在Devtools检测到必须执行某些操作时才会重新启动。 触发文件可以手动更新或使用IDE插件更新。

要使用触发器文件,请将spring.devtools.restart.trigger-file属性设置为触发器文件的路径

您可以通过将名为.spring-boot-devtools.properties的文件添加到您的$ HOME文件夹来配置全局devtools设置(请注意文件名以“。”开头)。 添加到此文件的任何属性都适用于使用devtools的计算机上的所有Spring Boot应用程序。 例如,要将重新启动配置为始终使用触发器文件,您可以添加以下属性:

~/.spring-boot-devtools.properties.

spring.devtools.reload.trigger-file=.reloadtrigger

您可能需要将spring.devtools.restart.trigger-file设置为全局设置,以便所有项目的行为方式相同。

3.8 自定义重启类加载器

如前面的“重新启动vs重新加载”部分所述,重新启动功能通过使用两个类加载器来实现。 对于大多数应用程序,这种方法运作良好 但是,它有时会导致类加载问题。

默认情况下,IDE中任何打开的项目都会加载“restart”类加载器,并且任何常规的.jar文件都会加载“base”类加载器。 如果您使用多模块项目,并且不是每个模块都导入到IDE中,则可能需要自定义。 为此,您可以创建一个META-INF / spring-devtools.properties文件。

spring-devtools.properties文件可以包含以restart.exclude和restart.include为前缀的属性。 include元素是应该被拉入到“重启”类加载器中的项目,而排除元素是应该被下推到“基本”类加载器中的项目。 该属性的值是应用于类路径的正则表达式模式,如以下示例所示:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

所有属性键必须是唯一的。 只要属性以restart.include开头。 或重新启动。排除。 已经被考虑了。

加载类路径中的所有META-INF / spring-devtools.properties。 您可以将文件打包到您的项目中,也可以打包到项目使用的库中。

3.9  著名的限制

对于使用标准ObjectInputStream进行反序列化的对象,重新启动功能无法正常工作。

如果你需要反序列化数据,你可能需要结合使用Spring的ConfigurableObjectInputStream和Thread.currentThread()。getContextClassLoader()。

不幸的是,有些第三方库反序列化而没有考虑上下文类加载器。 如果您发现这样的问题,您需要向原作者请求修复。

Spring Boot 2.0 热部署指南的更多相关文章

  1. Spring Boot入门系列(十五)Spring Boot 开发环境热部署

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...

  2. Spring Boot应用 打包与部署指南

    Spring Boot的打包与部署有何特点? Java Web应用在Spring Boot之前,通常是打包成war(Web application ARchive)包,结合Tomcat来完成部署. 对 ...

  3. Spring Boot 五种热部署方式

    [推荐]2019 Java 开发者跳槽指南.pdf(吐血整理)>>> 1.模板热部署 在SpringBoot中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不 ...

  4. Spring Boot 应用的热部署配置

    前言 所谓热部署,简单来说,就是代码修改后不需重启项目就可自动加载出新的内容. 注意:热部署在 debug 调试模式下才生效! IDEA 配置 在 IDE(IDEA)中开启相关项目自动构建选项 开启编 ...

  5. Spring Boot 五种热部署方式,极速开发就是生产力!

    1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭 ...

  6. IntelliJ IDEA Spring boot devtools 实现热部署

    一.spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动部署新代码. 二.原理 使用了两个ClassLoader,一个ClassLoader用来加载那些不会变 ...

  7. spring boot 中的热部署

    <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>sprin ...

  8. spring boot入门学习---热部署

    1.maven文件 2.application.properties文件配置

  9. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

随机推荐

  1. Vijos1910 NOIP2014提高组 Day2T3 解方程 其他

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - Vijos1910 题意概括 已知多项式方程: a0+a1x+a2x2+...+anxn=0 求这个方程在[1 ...

  2. Evolution ZOJ2853

    矩阵太大导致爆栈 解决方法:矩阵不要开在main函数里面  全部在外面处理  main函数只能处理简单的赋值和加减 损失的要自减!! 最后为  sum+=t[i]*ans.m[i][n-1];   得 ...

  3. 【Java】 剑指offer(20) 表示数值的字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...

  4. X分钟速成Python

    先附上一张号称“一篇程序覆盖Python基础的代码”,基本的结构都涉及到了 源代码下载: learnpython-zh.py Python 由 Guido Van Rossum 在90年代初创建. 它 ...

  5. Nginx的配置详解

    人无再少年,花有重开日——风城玫瑰 德里克·罗斯 Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡. Ngin ...

  6. React Native之基于AsyncStorage的离线缓存框架设计

    1.为什么要离线缓存? 宏观上来说: 提升用户体验: 我们要为用户提供流畅的APP操作体验,但我们无法保证所有用户的网络流畅度是好的,所以我们需要离线缓存来提升用户体验. 节省流量: 节省流量又分为两 ...

  7. 洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)

    To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会 ...

  8. Codeforces.833B.The Bakery(线段树 DP)

    题目链接 \(Description\) 有n个数,将其分为k段,每段的值为这一段的总共数字种类,问最大总值是多少 \(Solution\) DP,用\(f[i][j]\)表示当前在i 分成了j份(第 ...

  9. 潭州课堂25班:Ph201805201 爬虫高级 第一课 pyspider框架 (课堂笔记)

    利用wheel安装 S1: pip install wheelS2: 进入www.lfd.uci.edu/~gohlke/pythonlibs/,Ctrl + F查找pycurl 这个包名是pycur ...

  10. 2016年3月12日Android学习笔记

    1. //此句不能忘,否则onFling左右滑动不起作用 mLlExamView.setLongClickable(true); mLlExamView.setOnTouchListener(new ...