众所周知,IDEA 自带的热加载只支持方法内的热加载,而使用 HotSwapAgent 不仅支持方法内的热加载,并且可实现新增方法的热加载,甚至是新增类的热加载,可谓是提高开发效率的神器 真棒.png
本文主要介绍在 IDEA 下使用 HotSwapAgent 来进行 SpringBoot 下的热部署;
接下来我们开始配置 HotSwapAgent

1 安装 DCEVM

DCEVM 是个JDK的插件,提供类似 JRebel 的热加载功能,能够在运行时重新定义加载的类,实现“热加载、热插拔、热部署”,而 HotSwapAgent 插件则是实现了 Servlet 程序的热加载功能,并且 DCEVM + HotSwapAgent 开源免费,更适合广大开发者使用。
安装 DCEVM 需要和 JDK 版本相对应,你需要先确定自己的 JDK 版本是否是 DCEVM 所支持的版本
https://github.com/dcevm/dcevm/releases
写此文时,DCEVM 支持的最新 JDK 版本是Java 8u181
如果你的JDK版本不被支持,则需要去 Oracle Java Archive 这个页面下载对应版本 JDK 并安装
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
下载 JDK 需要自备 Oracle 的账号
下载并安装好对应版本 JDK 后,我们再次来确定 JDK 版本为对应版本
2022-02-24T13:42:56.png

此时我们可以下载 DCEVM patch 进行安装,这里我下载的是 DCEVM-8u181-installer-build2.jar
https://github.com/dcevm/dcevm/releases
运行以下命令开始进行安装

java -jar DCEVM-8u181-installer-build2.jar

2022-02-24T13:43:41.png
这里需要选择安装目录,安装目录默认为 JDK 安装目录,如果没有则需要手动添加,然后点击 Install DCEVM as altjvm 这个按钮安装。

2 IntelliJ IDEA 配置

在 IDEA 插件库中搜索 HotSwapAgent 进行安装插件
2022-02-24T13:59:22.png
然后进行 HotSwapAgent plugin 配置
勾选为所有项目启动 HotSwapAgent 插件
2022-02-24T14:04:55.png
PS:请手动检查插件目录下的 jar 包是否自动下载成功,如果下载不成功,则手动下载 jar 包替换
2022-02-24T14:04:36.png
图中的 Agent installation 路径为Jar包保存路径
jar 包下载地址:https://github.com/HotswapProjects/HotswapAgent/releases

3 热部署启动

在 DEBUG 模式下启动应用程序。如果设置正确完成,您将在控制台中看到 HOTSWAP 代理通知。
2022-02-24T14:08:12.png

4 手动触发热部署方式

在应用启动的过程中,如果有修改代码,可以手动触发热部署使其生效
MacOS: Command+Shift+F9 / Win: Ctrl+Shift+F9
手动触发热加载的时候,光标需要将焦点保持在需要热加载的类上面
2022-02-24T14:09:02.png
当然你也可以配置自动触发热部署,由于我不喜欢自动触发,所以在此不做过多介绍。

5 热加载测试

我们使用Spring Initializr快速创建一个 SpringBoot 应用,并且编写一个简单的测试接口:
2022-02-24T14:11:02.png
2022-02-24T14:19:03.png
应用使用 DEBUG 模式启动的时候有提示被 HotSwapAgent 代理
2022-02-24T14:22:39.png
使用浏览器访问测试接口,正常访问
2022-02-24T14:23:03.png

1 修改方法体内代码,手动触发热加载
2022-02-24T14:23:49.png
提示1个类被重新加载
2022-02-24T14:23:31.png
再次访问接口,方法体内修改的代码已经生效
2022-02-24T14:24:09.png

2 新增一个方法,手动触发热加载
2022-02-24T14:24:53.png
提示1个类被重新加载,并且类被重新注册
2022-02-24T14:25:27.png
访问新增的接口,新增的方法已经生效
2022-02-24T14:25:48.png

3 新增一个类,手动触发热加载
2022-02-24T14:26:28.png
提示0个类被重新加载,但是新增的Controller2类已经被注册,说明只能重新加载被 Spring 注解标注的类
2022-02-24T14:26:49.png
访问新增的类接口,新增的类已经生效
2022-02-24T14:27:04.png

6 测试总结

经测试,修改方法体内代码,修改方法,并且新增类都是可以支持热加载,但是新增类只支持注解扫描的类,XML配置文件不能进行热加载

7 参考文档

https://github.com/HotswapProjects/HotswapAgent
https://github.com/dmitry-zhuravlev/hotswap-agent-intellij-plugin