Idea调试热更新那些事

时间:2025-03-22 08:49:36

用惯了Eclipse,对于eclipse的调试过程中HotSwap生效感觉很爽,更换为IDEA后,总觉得别扭得很,非要手动触发“Recompile '*.java'"这个才能生效。最开始老是感觉我哪里理解不到位,或者我的环境配置哪里有问题,反正就是一顿感觉不爽。总想实现类似Eclipse中的效果,但是一直求而不得,只能反复试验,反复求证。

目标:

希望在IntelliJ IDEA中在调试过程中对类代码的修改、能够自动编译、加载以及HotSwap立即生效,再在方法中通过“Reset Frame"的方式来马上看到修改后的效果。

1.环境:

IntelliJ IDEA 2024.1 (Community Edition)

JDK使用jdk-17.0.8

Mac (Apple M2 Max)

2.配置:

1)开启自动编译: 打开 [Settings]。 转到 [Build, Execution, Deployment] -> [Compiler]。 勾选 'Build project automatically'。

2)配置HotSwap: 在 [Build, Execution, Deployment] -> [Debugger] -> [HotSwap] 下, 勾选 'Build project before reloading classes'。 选择 'Reload classes after compilation: 'Always'。

3)允许在应用运行时开始自动编译: 在 [Settings 中转到 [Advanced Settings] -> [Compiler]。 勾选 'Allow auto-make to start even if developed application is currently running'。

4)项目编译输出路径设置: 在 [Project Structure] -> [Project Settings] -> [Modules] -> [Paths] 中查看,默认是项目的根路径下的“target/classes”。

3.结果:

1)在调试过程中,修改了类代码,可以在工程的“target/classes”下面的对应包目录看到类被自动编译了,但是不能被自动加载,HotSwap也不能自动生效,点击菜单[Run][Debugging Actions][Reload changed classes] 提示“Loaded classes are up to date. Nothing to reload”.

2)在调试过程中,修改了类代码,在菜单[Build]中点击“Recompile ''"后,可以在工程的“target/classes” 下面的对应包目录看到类被自动编译了,可以被自动加载并且HotSwap也立即生效了,从当前断点处点击“Reset Frame"后,修改后的代码马上生效。

4.原因分析:

在IntelliJ IDEA中,只有当您手动点击Build -> Recompile '.java'或使用相应的快捷键来编译选定的Java文件时,IDE才会尝试使用HotSwap机制来加载这些新编译的类到正在运行的JVM中。这个过程允许您在调试时即时看到代码更改的效果。

自动编译功能虽然也会更新target/classes目录下的类文件,但它不会自动触发HotSwap过程。自动编译主要是为了在开发过程中提供即时的编译错误反馈,而不是为了在运行时更新类定义。因此,如果想要在调试过程中实现代码的热替换(HotSwap),需要通过手动编译的方式来触发这一过程。