| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么? -> 正文阅读 |
|
[Java知识库]SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么? |
准备知识点什么是热部署和热加载?
严格意义上,我们需要区分下热部署和热加载, 对于Java项目而言:
什么是LiveLoad?LiveLoad是提供浏览器客户端自动加载更新的工具,分为LiveLoad服务器和Liveload浏览器插件两部分; devtools中已经集成了LiveLoad服务器,所以如果我们开发的是web应用,并且期望浏览器自动刷新, 这时候可以考虑LiveLoad. 同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。 配置devtools实现热部署
POM配置添加spring-boot-devtools的依赖
IDEA配置
(也可以用
设置1: File->Setting->Build,Execution,Deployment->Compile 勾选:Make project automatically 设置2: 快捷键:ctrl+alt+shift+/ 选择:Registry 勾选:compiler.automake.allow.when.app.running 新版本的IDEA可以在File->setting->Advanced Setttings里面的第一个设置: application.yml配置
使用LiveLoadspring-boot-devtools模块包含嵌入式LiveReload服务器,可以在资源更改时用于触发浏览器刷新。 LiveReload浏览器扩展程序支持Chrome,Firefox和Safari,你可以从livereload.com免费下载。 或者从浏览器插件中心下载,比如firefox: 安装完之后,可以通过如下图标管理 如果你不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false 。 同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。 进一步理解
devtool的原理?为何会自动重启?
spring-boot-devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会发生更改的类(第三方jar包),另一个ClassLoader(restart ClassLoader)加载会更改的类(自定义的类)。 后台启动一个文件监听线程(File Watcher),监测的目录中的文件发生变动时, 原来的restart ClassLoader被丢弃,将会重新加载新的restart ClassLoader。 因为文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快。 这也是为什么,同样是重启应用,为什么不手动重启,建议使用spring-boot-devtools进行热部署重启。 在自动重启中有几点需要注意:
(记录在什么情况下重启的日志) 可以通过如下关闭
某些资源在更改时不一定需要触发重新启动。默认情况下,改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public,或/templates不触发重新启动,但确会触发现场重装。如果要自定义这些排除项,可以使用该spring.devtools.restart.exclude属性。例如,要仅排除/static,/public你将设置以下属性:
如果要保留这些默认值并添加其他排除项,请改用该spring.devtools.restart.additional-exclude属性。
重启功能是通过使用两个类加载器来实现的。对于大多数应用程序,这种方法效果很好。但是,它有时会导致类加载问题。 默认情况下,IDE 中的任何打开项目都使用“重启”类加载器加载,任何常规.jar文件都使用“基本”类加载器加载。如果你处理一个多模块项目,并且不是每个模块都导入到你的 IDE 中,你可能需要自定义一些东西。为此,你可以创建一个META-INF/spring-devtools.properties文件。 该spring-devtools.properties文件可以包含以restart.exclude和为前缀的属性restart.include。该include元素是应该被拉高到“重启”的类加载器的项目,以及exclude要素是应该向下推入“Base”类加载器的项目。该属性的值是应用于类路径的正则表达式模式,如以下示例所示:
更多相关的信息可以在这里查看。 devtool是否会被打包进Jar?
运行打包的应用程序时,开发人员工具会自动禁用。如果你通过 java -jar或者其他特殊的类加载器进行启动时,都会被认为是“生产环境的应用”。
(生产环境勿用,只有在受信任的网络上运行或使用 SSL 进行保护时,才应启用它) 在这种情况下,devtool也具备远程调试的能力:远程客户端应用程序旨在从你的 IDE 中运行。你需要org.springframework.boot.devtools.RemoteSpringApplication使用与你连接的远程项目相同的类路径运行。应用程序的唯一必需参数是它连接到的远程 URL。 例如,如果使用 Eclipse 或 Spring Tools,并且你有一个my-app已部署到 Cloud Foundry 的名为的项目,执行以下操作:
正在运行的远程客户端可能类似于以下列表:
devtool为何会默认禁用缓存选项?
虽然缓存在生产中非常有益,但在开发过程中可能会适得其反,使你无法看到刚刚在应用程序中所做的更改。出于这个原因, spring-boot-devtools 默认禁用缓存选项。 比如Thymeleaf 提供了spring.thymeleaf.cache来设置模板引擎的缓存,使用spring-boot-devtools模块时是不需要手动设置这些属性的,因为spring-boot-devtools会自动进行设置。 那么会自动设置哪些配置呢?你可以在DevToolsPropertyDefaultsPostProcessor类找到对应的默认配置。
当然如果你不想被应用属性被spring-boot-devtools默认设置, 可以通过spring.devtools.add-properties到false你application.yml中。 devtool是否可以给所有Springboot应用做全局的配置?
添加到这些文件的任何属性都适用于你机器上使用 devtools 的所有Spring Boot 应用程序。例如,要将重新启动配置为始终使用触发器文件,你需要将以下属性添加到你的spring-boot-devtools文件中:
如果我不用devtool,还有什么选择?
在实际的开发过程中,我也不会去使用devtool工具, 因为:
示例源码https://github.com/realpdai/tech-pdai-spring-demos 参考文章https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools https://liayun.blog.csdn.net/article/details/116541775 更多内容告别碎片化学习,无套路一站式体系化学习后端开发: Java 全栈知识体系(https://pdai.tech) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:30:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |