SpringBoot实现热部署

一、热部署(Hot Swap)

  从Java1.4起,JVM引入了HotSwap,能够在Debug的时候更新类的字节码。所以使用热部署,可以实现修改代码后,无须重启服务就可以加载修改的代码,但是它只能用来更新方法体。

实例方式:

  1.  通过IDEA实例热部署。
  2. 通过DevTools

二、配置IDEA

  点击当前运行的服务,再点击Edit Configurations

  点击要配置的程序,找到 On ‘Update’ action 和 On frame deactivation选择 Update classes and resources。点击OK就可以实现热部署了。

  经过以上配置,在修改代码以后。只需要点击小锤子或者使用快捷键Command + F9重新编译一下,就可以让改动的代码生效了。并且还会提示有多少个class被重新读取了。

   虽然到这里已经能实现热部署的功能了。但是Java的虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。

三、DevTools

Spring Boot 提供了一套额外的工具,可以让你更加愉快的开发应用。 spring-boot-devtools 模块可以包含在任何项目中,以在开发期间提供一些有用的特性。 要使用devtools,请添加以下依赖到项目中。

Maven

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

1、触发重启

   DevTools严格意义上其实不算热部署,而是快速重启。为什么这样说呢?DevTools的实现原理是:使用两个类加载器,一个是base classloader来加载不会被更改的类(例如,来自第三方的Jar),还有一个是restart classloader用来加载当前正在开发的类。所以当应用程序重新启动时,restart classloader将被丢弃,并创建一个新的类加载器。也就意味着应用程序重新启动通常比“冷启动”快得多,因为base classloader已经填充好了并且是可用的。

  简而言之就是:通过监控类路径资源,当类路径上的文件发生更改时,自动重新启动应用程序,由于只需要重新读取被修改的类,所以要比冷启动快

由于DevTools监控classpath资源,触发重启的唯一方法是更新classpath。 无论你使用的是IDE还是构建插件,被修改的文件都必须被重新编译以触发重启。 导致更新classpath的方式取决于你所使用的工具。

  • 在Eclipse中,保存一个修改过的文件会导致classpath被更新并触发重启。

  • 在IntelliJ IDEA中,构建项目( Build +→+ Build Project )有同样的效果。

  • 如果使用构建插件,运行Maven的 mvn compile 或Gradle的 gradle build 会触发重启。

 

2、配置自动重启

  这时候可能有小伙伴想问了,难道IDEA没有类似于Eclipse中保存文件自动触发重启的功能嘛。那肯定是有的,只需要进行下面两步的配置就可以实现了。

注意:需要将前面的设置,全部还原。

  1. 开启Build project automatically

  2. 使用快捷键:Ctrl + Alt + Shift + / 调出 Registry 窗口,勾选 compiler.automake.allow.when.app.running 选项。

新版本如下图所示:

如果你的应用程序是通过 java -jar 启动的,或者是从一个特殊的classloader启动的,那么它就被认为是一个 "生产级别的应用程序",开发者工具会被自动禁用。 你可以通过 spring.devtools.restart.enabled 配置属性来控制这一行为。 要启用devtools,无论用于启动应用程序的类加载器是什么,请设置启动参数 -Dspring.devtools.restart.enabled=true 。 在生产环境中不能这样做,因为运行devtools会有安全风险。 要禁用devtools,请删除该依赖或者设置启动参数 -Dspring.devtools.restart.enabled=false

3、禁止重启

如果你不想使用重启功能,你可以通过使用 spring.devtools.restart.enabled 属性来禁用它。在大多数情况下,你可以在你的 application.properties 中设置这个属性(这样做仍然会初始化restart 类加载器,但它不会监控文件变化)。

如果你需要完全禁用重启支持(例如,因为它不能与特定的库一起工作),你需要在调用 SpringApplication.run(…​) 之前将 spring.devtools.restart.enabled 属性设置为 false ,如下面的例子中所示。

Java

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

3、属性的默认值 

在Spring Boot支持的一些库中,会使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。另外,Spring MVC可以在响应静态资源时往响应中添加HTTP缓存头。 虽然缓存在生产中是非常有益的,但在开发过程中可能会产生反作用,使你无法看到你在应用程序中刚做的改动。 由于这个原因,spring-boot-devtools 默认禁用了缓存选项。 缓存的选项通常是通过 application.properties 文件中的属性来配置的。 例如,Thymeleaf提供了 spring.thymeleaf.cache[] 属性。 与其需要手动设置这些属性,spring-boot-devtools 模块会在开发场景下合理的设置这些属性。 下表列出了所有被设置的属性。

NameDefault Value

server.error.include-binding-errors

always

server.error.include-message

always

server.error.include-stacktrace

always

server.servlet.jsp.init-parameters.development

true

server.servlet.session.persistent

true

spring.docker.compose.readiness.wait

only-if-started

spring.freemarker.cache

false

spring.graphql.graphiql.enabled

true

spring.groovy.template.cache

false

spring.h2.console.enabled

true

spring.mustache.servlet.cache

false

spring.mvc.log-resolved-exception

true

spring.reactor.netty.shutdown-quiet-period

0s

spring.template.provider.cache

false

spring.thymeleaf.cache

false

spring.web.resources.cache.period

0

spring.web.resources.chain.cache

false

4、全局设置

你可以通过在 $HOME/.config/spring-boot 目录下添加以下任何文件来配置全局的devtools设置。

  1. spring-boot-devtools.properties

  2. spring-boot-devtools.yaml

  3. spring-boot-devtools.yml

添加到这些文件中的任何属性都适用于你机器上使用devtools的 所有 Spring Boot应用程序。 例如,​ 如果要将重启配置为总是使用trigger file,你可以在 spring-boot-devtools 文件中添加以下属性。

Yaml

spring:devtools:restart:trigger-file: ".reloadtrigger"

默认情况下,$HOME 是用户的主目录。 要自定义这个位置,请设置 SPRING_DEVTOOLS_HOME 环境变量或 spring.devtools.home 系统属性。

5、远程应用

Spring Boot的开发者工具并不局限于本地开发。 你也可以在远程运行应用程序时使用一些功能。 远程支持是可选的,因为启用它可能会有安全风险。 只有在受信任的网络上运行时,或在用SSL保护时,才应启用它。 如果这两个选项对你来说都不可用,你就不应该使用DevTools的远程支持。 你更不应该在生产环境中启用它。

要启用它,你需要确保 devtools 包含在重新打包的归档文件(jar)中,如以下所示。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludeDevtools>false</excludeDevtools></configuration></plugin></plugins>
</build>

然后你需要设置 spring.devtools.remote.secret 属性。 就像任何重要的密码或密钥一样,这个值应该是唯一的和足够强大的,以至于它不能被猜到或被暴力破解。

Remote devtools support is provided in two parts: a server-side endpoint that accepts connections and a client application that you run in your IDE. The server component is automatically enabled when the spring.devtools.remote.secret property is set. The client component must be launched manually.

远程devtools支持由两部分组成:一个接受连接的服务器端端点和一个你在IDE中运行的客户端应用程序。 当 spring.devtools.remote.secret 属性被设置时,服务器组件会自动启用。 客户端组件必须手动启动。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

/dev/sda1 contains a file system uith errors,check forced.

系列文章目录 /dev/sda1 contains a file system uith errors&#xff0c;check forced. MfgTool烧写工具 系列文章目录一、问题描述2、报错原因3、解决方法4、重启遇见问题5、解决办法 一、问题描述 打开虚拟机的时候卡顿&#xff0c;于是强制任务管理器关闭虚拟机&#xff0c…

详解一次一密

目录 一. 介绍 二. 一次一密方案 三. 正确性分析 四. 证明一次一密方案是完美安全 五. 一次一密的应用 六. 小结 一. 介绍 一次一密&#xff0c;英语写做one time pad。 在1917年&#xff0c;Vernam提出了一个完美安全的加密方案&#xff0c;后世将其称之为一次一密。在…

wfuzz网站模糊测试

https://github.com/xmendez/wfuzz Wfuzz: The Web fuzzer — Wfuzz 2.1.4 documentatio n 一、wfuzz介绍 WFuzz是基于Python开发的 Web安全模糊测试工具。可以将其理解为Fuzz一款暴力破解工具。根据用户提供的字典&#xff0c;获取web站点的敏感目录和信息。 Wfuzz 提供了一个…

Java中的this和super

①this 在Java中&#xff0c;this关键字代表当前对象的引用。它可以用于以下几个方面&#xff1a; 引用当前对象的成员变量&#xff1a;使用this关键字可以引用当前对象的成员变量&#xff0c;以区分成员变量和方法参数或局部变量之间的命名冲突。例如&#xff0c;如果一个方法…

flv怎么转换成mp4格式?

flv怎么转换成mp4格式&#xff1f;视频格式转换是一件习以为常的操作&#xff0c;将flv格式转成mp4可以解决的事情非常多。MP4是一种通用的视频格式&#xff0c;几乎所有设备和平台都支持MP4格式。因此&#xff0c;将FLV格式转换为MP4格式可以增强视频的兼容性&#xff0c;使其…

idea创建公用依赖包项目

创建parent项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

c++:类和对象(2),对象的初始化和清理

目录 构造函数和析构函数 构造函数语法&#xff1a;类名&#xff08;&#xff09;{} 析构函数语法: ~类名 () {} 例子&#xff1a; 构造函数的分类及调用 两种分类的方式&#xff1a; 三种调用方法&#xff1a; 括号法​编辑 显示法 隐式转换法 拷贝构造函数调用时…

【前端web入门第一天】01 开发环境、HTML基本语法文本标签

文章目录: 1. 准备开发环境 1.1 vs Code基本使用 2.HTML文本标签 2.1 标签语法2.2 HTML基本骨架2.3 标签的关系2.4 注释2.5 标题标签2.6 段落标签2.7 换行与水平线标签2.8 文本格式化标签 1. 准备开发环境 VSCode与谷歌浏览器离线版,安装包评论区自提. VSCode默认安装位置:C…

离线编译 onnxruntime-with-tensortRT

记录为centos7的4090开发机离线编译onnxruntime的过程&#xff0c;因为在离线的环境&#xff0c;所以踩了很多坑。 https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html 这里根据官网的推荐安装1.15 版本的onnx 因为离线环境&#xff0c;所以很…

微信小程序如何做到高效引流?-数灵通

随着微信小程序制作门槛的降低&#xff0c;大量的小程序如雨后春笋般涌现&#xff0c;其中小程序商城类型尤为众多。然而&#xff0c;由于微信自身的流量有限&#xff0c;对于大多数小程序商城而言&#xff0c;获取足够的流量成为了一大挑战。 针对这一问题&#xff0c;我们可以…

【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

文章目录 方案一览Gateway软件介绍启动容器配置apt源在容器中安装SSH服务器配置SSH服务器生成SSH密钥启动SSH服务为root创建密码连接到容器使用Gateway 方案一览 本篇博客将介绍如何在Docker容器中打开SSH连接服务&#xff0c;以及如何使用JetBrains Gateway软件进行代码调试。…

C++ | 六、栈 Stack、队列 Queue

栈的基础知识 栈&#xff08;stack&#xff09;是一种数据结构&#xff0c;在C中属于STL&#xff08;标准库&#xff09;特点&#xff1a;先进后出 栈的使用&#xff1a; 一、引入头文件<stack>二、创建栈变量&#xff08;类似容器、集合的创建方式&#xff09;&#xf…