Skip to content

热重载 beta ​

INFO

热重载实现复杂且需要兼容情况较多,如果这个项目帮你节省了开发时间,不妨点个 ,你的认可会让更多人发现它,你的支持是我更新的动力。如果不生效麻烦提交 反馈一下。

传统编写代码时,需要重启应用才能生效,而热重载可以在不重启应用下让编写的代码生效立刻,让开发者编写的代码改动瞬间生效,极大提升迭代效率。支持类(包括代理类)的属性和方法变动、Spring、Solon、Mybatis等主流框架。同时适配 jdk8、jdk11、jdk17、jdk21、jdk25 等多个JDK版本。

1. 开启热重载 ​

  • 请关掉idea的 Build, Execution, Deployment -> Debugger -> Async Stack Traces 配置

instrumenting_agent.png

  • 点击 More Actions 中的 Hotswap 'xxx' with DebugTools 以热重载的方式启动应用。

start_hotswap.png

如果觉得每次都要展开 More Actions 比较繁琐,可以将按钮配置在 Main Toolbar 中

比如在右侧添加按钮如下图所示:

main_toolbar.png

搜索 Hotswap with DebugTools,如果想调 Icon 也可以在下面修改。

add_hotswap_action.png

这样就可以在外面点击了

start_hotswap_toolbar.png

TIP

  • 热重载需要特定的jdk才能生效,请先参考JDK安装完成JDK的初始化。
  • 不更换jdk也可以使用热重载,只是无法更改类的签名(推荐更换jdk)。

启动项目如果提示 DCEVM is not installed ,检查JDK安装是否正确。JDK8 检查命令 java -XXaltjvm=dcevm -version 是否能正常输出。 dcevm_not_install.png

2. 触发热重载 ​

热重载是通过 debug 方式启动应用,项目输出如下日志,并打印载入的热重载插件。

text
DebugTools: 2025-01-07 16:41:07.909    INFO [main] i.g.f.d.t.h.c.HotswapAgent 44 : open hot reload unlimited runtime class redefinition.{3.3.0}
DebugTools: 2025-01-07 16:41:08.498    INFO [main] i.g.f.d.t.h.c.c.PluginRegistry 132 : Discovered plugins: [JdkPlugin, ClassInitPlugin, AnonymousClassPatch, WatchResources, HotSwapper, Proxy, Spring, MyBatis]

2.1 Debug热更新 ​

  • 通过右键菜单的 Compile and Reload Modified Files 按钮.

compile_reload_file.png

  • 文件主页面的 Code changed 按钮.

compile_code_changed.png

2.2 热部署 ​

热部署能发远程应用,当然也可以用于将本地变更部署到已经附着的目标应用。

详细配置和操作请查看热部署。

2.3 单文件远程编译 ​

在 Java 源文件的编辑器或项目树中打开右键菜单,点击 远程编译并热部署 "xxx.java",插件会先保存当前文件,再把源码发送到已附着的目标应用,由目标应用完成远程编译并立即热部署。

如果当前项目同时连接了多个应用,点击后会先选择要部署到的连接;执行时会使用该连接卡片中当前选中的 ClassLoader。

hot_deploy_remote_compile_context_menu.png

热部署完成后,结果会输出到 IDEA 的 Run 工具窗口,页签标题为 远程部署结果;多应用连接时标题会带上应用名称。

hot_deploy_remote_compile_result.png

TIP

  • 只有附着应用后才支持通过热部署的方式热重载变动文件
  • 使用远程动态编译时,附着应用必须要通过 JDK 启动,不能使用 JRE 启动。

TIP

热部署时idea可能有时无法获取到最新的断点信息,如果需要及时更新断点请使用方式1

2.4 单资源文件 ​

单文件操作支持 XML、HTML、FTL、YAML、Properties 等非 Java 文件。在文件编辑器或项目树中打开右键菜单,点击 复制 '文件名' 到target目录,将当前文件写入模块生产输出目录的相对路径。

例如 src/main/resources/templates/index.ftlh 会复制到 target/classes/templates/index.ftlh;实际目录以 IDEA 模块输出配置为准。

这一步只更新资源文件,不会自动刷新所有框架的配置。使用流程和生效条件见资源文件热重载与部署。

2.5 自动监听 class 文件 ​

可在 Settings | DebugTools | 热重载 中启用 自动监听 class 文件并重载,该设置默认关闭。

  1. 勾选该设置并保存。
  2. 重新启动目标应用。支持的普通 Java Run/Debug 配置也会按该设置注入热重载 Agent;Maven/Gradle 自身的启动进程不适用此入口。
  3. 修改 Java 源码后执行 IDEA 编译,或使用项目已有的编译流程更新输出目录。
  4. Agent 监听到编译后的 .class 文件变化后,自动重载目标 ClassLoader 中已经加载的类。

自动监听不会编译 Java 源码。只保存 .java 文件、但没有更新编译输出时,不会触发类重载;新增类尚未加载时也不属于“重定义已加载类”的范围。

TIP

  • 自动监听仍受目标 JDK 的类重定义能力限制。需要新增或删除字段、方法时,请先完成 JDK 安装。
  • 修改设置后要重新启动应用,不会动态改变已经启动的 JVM。
  • 自动监听可能与 Compile and Reload Modified Files 或手动热部署重复触发;按需要选择触发方式。
  • 禁用 HotSwapper 插件会关闭自动监听重载能力。

不通过 IDEA 启动时,可在现有热部署启动参数中添加 autoHotswap=true:

shell
-javaagent:/path/to/debug-tools-agent.jar=hotswap=true,autoHotswap=true

这只是 Agent 参数示例,目标 JDK 所需的 DCEVM、增强类重定义和模块访问参数仍按热部署配置设置。

3. 哪些情况可以热重载 ​

3.1 普通的class文件 ​

  • 新增类文件
  • 存在的类 增加/修改 类中的 属性/方法/内部类。
  • 匿名内部类
  • 枚举类

详细点击 class文件热重载 查看

静态信息变动特别注意

静态字段热重载会编译时初始化的值覆盖掉运行时的值,具体点击查看

3.2 代理类 ​

  • java JDK 代理类。
  • Cglib 代理类。

详细点击 代理类热重载 查看

3.3 SpringBoot Bean ​

  • Controller
  • Service
  • Component
  • Repository

详细点击 SpringBoot 查看

3.4 MyBatis ​

  • Mapper(新增/修改)
  • Xml(新增/修改)

注意

MyBatis 目前支持在 Spring 环境下,其他情况未知。

详细点击 MyBatis 查看

3.5 MyBatisPlus ​

  • Entity(新增/修改)
  • Mapper(新增/修改)
  • Xml(新增/修改)

注意

MyBatisPlus 目前支持在 Spring 环境下,其他情况未知。

详细点击 MyBatisPlus 查看

3.6 dynamic-datasource ​

  • @DS注解新增
  • @DS注解修改

详细点击 DynamicDatasource 查看

3.7 HuTool ​

支持 hutool 热重载

  • ReflectUtil 反射工具类
  • BeanDesc bean描述符
  • JSONUtil json工具类

3.8 Gson ​

支持 Gson 工具包热重载

3.9 EasyExcel ​

支持 EasyExcel 热重载

3.10 Jackson ​

支持 Jackson 热重载

3.11 FastJson、FastJson2 ​

支持 FastJson、FastJson2热重载

3.12 hibernate-validator ​

支持 hibernate-validator 工具包热重载

3.13 Solon ​

支持 Solon 类及容器热重载

  • Controller
  • Component
  • Configuration
  • ...

详细点击 Solon 查看

3.14 OpenFeign ​

支持 OpenFeign 热重载

  • 支持 @FeignClient 注解标记的接口新增/修改

3.15 Forest ​

支持 forest 热重载

  • 支持接口等新增/修改

3.16 Freemarker ​

支持模板内容更新,以及类重定义后的对象包装器缓存清理。详细用法见 Freemarker 热重载。

3.17 Thymeleaf ​

支持模板渲染前清理对应模板缓存。详细用法见 Thymeleaf 热重载。

3.18 其他 ​

其他情况热重载尝试一下,这里不一一举例了,如果不能生效麻烦提交个 issues 反馈一下。

4. 禁用热重载插件 ​

如果某个热重载插件在当前项目中存在兼容问题,可以先在 Settings | DebugTools | 热重载 中临时禁用指定插件,再重新以热重载方式启动应用。

hot_reload_disable_plugins.png

禁用插件 会把选中的插件名称写入热重载启动参数 disabledPlugins。Agent 初始化时会根据插件名跳过对应插件,适合用于临时规避某个框架插件引起的启动异常、类转换异常或热重载副作用。

可选插件按类型分组:

分组插件
BaseJdkPlugin、Class、Proxy、HotSwapper、WatchResources
Third PartySpring、Feign、MyBatis、Solon、Forest、Freemarker、Thymeleaf
OtherIntelliJIdea、HibernateValidator、EasyExcel、Gson、FastJson、HuTool

WARNING

  • 这个配置只影响后续重新启动的热重载应用;已经启动的应用不会因为修改设置立即卸载插件。
  • 禁用插件会关闭对应能力。例如禁用 Spring 后,Spring Bean 新增/修改相关的热重载能力也会失效。
  • 如果只是排查问题,建议一次只禁用一个插件,确认影响范围后再决定是否长期保留。