提效神器, 比单测还快! 代码热更新+一键触发=快速调试

815 阅读3分钟

插件效果, 已用了好几年, 非常提效 录制_2024_10_08_20_22_22_959.gif

背景

在 spring 项目里面每次想调试一个方法都非常麻烦, 存在2个问题, 一个是重新启动耗时长, 另一个是需要额外提供 http 方法来调用底层的方法. 如果使用单元测试虽然可以避免第二个问题 但需要加载 spring 容器同样非常耗时.

有个热部署组件很好解决第一个问题, 那就是 JRebel, Jrebel 是收费的, 但基于上次的文章, 已经破解过了, 所以不存在收费的问题. 手把手破解jrebel

解决完重新启动耗时长的问题, 如何解决快速调用某个方法?

设计思路

结合 IDEA 的插件, 思路是这样子的:

  1. 项目启动的时候开启一个 http 的端口, 支持接收类名, 方法声明和对应的入参, 并根据类名, 方法声明, 入参调用方法. 因为希望做到对项目无感的, 因此启动 http 端口并执行方法的逻辑是通过 javaAgent 进行注入的. javaAgent 是需要在启动命令配置的, 因此可以通过 IDEA 插件自动添加启动命令的方式支持.
  2. IDEA 插件通过获取光标所在的方法的类名, 方法声明来调用方法. 因为插件没法知道入参的值, 因此目前只能支持触发无参构造的方法.
  3. 新增一个 test() 方法, 里面的逻辑是调用一个需要测试的方法, 例如 login("username","password").
  4. 通过热部署加载 test() 方法, 通过 IDEA 插件触发步骤 2 的逻辑.

image.png

使用指南

1.初次使用会有提示, 选择同意并不再展示即可

image.png

image.png

image.png

2.使用 jrebel debug 来启动项目

image.png

3.在某个bean里面创建方法, 方法不能有入参

image.png

  1. 光标处于方法中, 并出发 Action 快速调用启动 (快速调用重启动则默认执行上次启动的方法, 便于在debug时不用再重新定位光标). 强烈推荐使用快捷键, 视频只是为了演示方便使用菜单触发.

录制_2024_10_08_20_22_22_959.gif

可配置去掉 sql 打印或者 explain

录制_2024_10_08_20_24_59_278.gif

如果有用 jrebel 需要先卸载了, 插件内部已集成 jrebel

下载地址: pan.quark.cn/s/16ca911a4… 插件地址: plugins.jetbrains.com/plugin/2562…

版本支持: 支持 jdk8,11,17. spring 5.x,6.x. 外置 tomcat 启动 (spring 5.x)

虽然代码设计已尽量支持更多版本的组件, 但因为只测试过小部分, 所以有可能有部分组件版本不兼容导致有问题, 可以联系作者进行优化.

异常路径:

  1. 如果升级出现异常或者无法进行热更新, 或者项目启动时 jrebel 显示无法认证成功, 可以先卸载了, 重启后再安装试试
  2. 初次使用可能会有jrebel的提示, 需要进行激活, 直接选择文件激活即可, lic文件默认在插件安装目录里面, 如window的话是在 %appdata%\IntelliJIdea-{version}\plugins\instant-invoke\lib\jrebel\jrebel_test.lic
  3. 应该启动异常,检查项目asm依赖的版本号,插件默认是 ASM5 ,版本过低可能导致注入失败,升级版本即可解决问题。
  4. 测试过 jdk spring boot 3.3.4, mysql-connector-java 8.0.33, 5.1.18, 5.1.49