插件效果, 已用了好几年, 非常提效
背景
在 spring 项目里面每次想调试一个方法都非常麻烦, 存在2个问题, 一个是重新启动耗时长, 另一个是需要额外提供 http 方法来调用底层的方法. 如果使用单元测试虽然可以避免第二个问题 但需要加载 spring 容器同样非常耗时.
有个热部署组件很好解决第一个问题, 那就是 JRebel, Jrebel 是收费的, 但基于上次的文章, 已经破解过了, 所以不存在收费的问题. 手把手破解jrebel
解决完重新启动耗时长的问题, 如何解决快速调用某个方法?
设计思路
结合 IDEA 的插件, 思路是这样子的:
- 项目启动的时候开启一个 http 的端口, 支持接收类名, 方法声明和对应的入参, 并根据类名, 方法声明, 入参调用方法. 因为希望做到对项目无感的, 因此启动 http 端口并执行方法的逻辑是通过 javaAgent 进行注入的. javaAgent 是需要在启动命令配置的, 因此可以通过 IDEA 插件自动添加启动命令的方式支持.
- IDEA 插件通过获取光标所在的方法的类名, 方法声明来调用方法. 因为插件没法知道入参的值, 因此目前只能支持触发无参构造的方法.
- 新增一个 test() 方法, 里面的逻辑是调用一个需要测试的方法, 例如 login("username","password").
- 通过热部署加载 test() 方法, 通过 IDEA 插件触发步骤 2 的逻辑.
使用指南
1.初次使用会有提示, 选择同意并不再展示即可
2.使用 jrebel debug 来启动项目
3.在某个bean里面创建方法, 方法不能有入参
- 光标处于方法中, 并出发 Action 快速调用启动 (快速调用重启动则默认执行上次启动的方法, 便于在debug时不用再重新定位光标). 强烈推荐使用快捷键, 视频只是为了演示方便使用菜单触发.
可配置去掉 sql 打印或者 explain
如果有用 jrebel 需要先卸载了, 插件内部已集成 jrebel
下载地址: pan.quark.cn/s/16ca911a4… 插件地址: plugins.jetbrains.com/plugin/2562…
版本支持: 支持 jdk8,11,17. spring 5.x,6.x. 外置 tomcat 启动 (spring 5.x)
虽然代码设计已尽量支持更多版本的组件, 但因为只测试过小部分, 所以有可能有部分组件版本不兼容导致有问题, 可以联系作者进行优化.
异常路径:
- 如果升级出现异常或者无法进行热更新, 或者项目启动时 jrebel 显示无法认证成功, 可以先卸载了, 重启后再安装试试
- 初次使用可能会有jrebel的提示, 需要进行激活, 直接选择文件激活即可, lic文件默认在插件安装目录里面, 如window的话是在 %appdata%\IntelliJIdea-{version}\plugins\instant-invoke\lib\jrebel\jrebel_test.lic
- 应该启动异常,检查项目asm依赖的版本号,插件默认是 ASM5 ,版本过低可能导致注入失败,升级版本即可解决问题。
- 测试过 jdk spring boot 3.3.4, mysql-connector-java 8.0.33, 5.1.18, 5.1.49