大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
项目每次启动都要一分多钟,改一行代码就要重启很难受?推荐一款提高工作效率的热加载JVM
插件:JRebel
。
JRebel
笔者也用很长一段时间了,这货确实帮我省了不少时间,所以才强烈推荐大家使用。
安装插件后,在idea
的左侧工具栏可以看到jrebel
选项,点开后勾选需要使用jrebel
插件的应用,如下图所示。
勾选后,当前项目的DEBUG
一栏会出现有jrebel logo
的debug
按钮,如下图所示。
当我们修改某个类后,如果想要即时生效,可在当前类的编辑窗口中右键,选择Compile And Reload File
,如下图所示。
这是一款实现热加载的JVM
插件,官方也为IDEA
提供了JRebel
IDEA
插件,使用和安装也都非常简单,动动手指就能找到很多安装教程。
推荐参考这篇文章的激活成功教程教程,简单可用:《
JRebel
激活成功教程最简单的使用》,链接:https://juejin.cn/post/6844903950781677582
。
安装插件后,在idea
的左侧工具栏可以看到jrebel
选择,点开后勾选需要使用jrebel
插件的项目,如下图所示。
勾选后,当前项目的DEBUG
一栏会出现有jrebel logo
的debug
按钮,如下图所示。
当我们修改某个类后,如果想要即时生效,可在当前类的编辑窗口中右键,选择Compile And Reload File
,如下图所示。
官网强调JRebel
是实现热加载的JVM
插件,那热加载与热部署有何不同呢?
jvm
进程不重启,重新加载整个web
应用;我们熟知的Tomcat
就是使用热部署实现不重启JVM
支持多web
应用部署以及重新部署,对web
应用而言是已经重起了,而JRebel
是使用热加载实现不重启应用也能使修改生效。
如果你做过Android
应用开发,那么你应该还熟悉一个词:热修复。
17
年笔者在做Android
应用开发的时候热修复这项技术就非常火,如热门代表:手Q
空间超级补丁技术、微信Tinker
、阿里百川HotFix
。手Q
空间超级补丁技术、微信Tinker
在实现原理上都是通过在应用启动时将新的dex
替换旧的dex
实现(替换class
),需要应用重启才生效,阿里百川推出的热修复HotFix
则不同于前两者,下拉补丁后无需重启应用就能立即生效。
为什么Android
应用开发领域的热修复可以那么火?不同于WEB
应用更新,WEB
应用更新用户是被动接受,而Android
版本更新需要用户主动去更新。而使用热修复可以实现让用户被动接受更新,在应用重启时神不知鬼不觉的动态修复bug
,优化用户体验,同时也就减少APP
的卸载率。
随着后端项目不断臃肿,导致依赖的很多框架初始耗时越来越长,热加载开始被用于提升后端开发效率,被用到后端开发调试上。当然,也有使用热加载实现修复线上bug
的,但在微服务容器化部署时代,已经体现不出这样做的价值了。
你可能会说,现在微服务不会很臃肿,本地调试重启也就几秒钟的事情,使用它效率也不明显。但如果重启需要重新登录或者说需要做一些初始化工作就不好说了。
尽管热加载很实用,它可以帮我们省去大部分改写代码的重启时间。但也并不是所有场景都能使用热加载替代重启。
如果我们改动的是Mybatis
的SQL
、Spring
的注解或配置类等,我们依然需要重启应用。原因很好理解,我们就以依赖Spring
和Mybatis
框架的应用为例说明。
首先是修改Spring
配置类或者一些类上的注解重新编译热加载后发现修改并未生效,这是因为Spring
只在容器启动时应用配置类、扫描Bean
类时读取类上的注解等。
其次是Mybatis
,无论我们修改的是注解上的Sql
还是xml
文件中的Sql
都不会生效,因为Mybatis
初始化时就需要读取xml
文件中的sql
或者接口方法上注解的sql
来为接口生成代理类,后续不会再用到注解或xml
文件,因此动态修改不会生效。
说到Mybatis
,笔者找到一款IDEA
插件能够解决修改sql
需要重启应用的问题:【jrebel-mybatisplus-idea-plugin
】https://github.com/SweetInk/jrebel-mybatisplus
。
关于JRebel
的实现原理笔者也不了解,因为找不到更多资料,JRebel
也不开源。如果让我实现一个简单的热加载,我也有一个简单的思路,通过已知的Java Agent
和IDEA
插件知识,可以通过动态重新加载类的方式完成简单的方法代码改写,也会有应用场景,如修复调试时发现的空指针异常、不涉及其它框架的业务逻辑错误、组件逻辑错误等,避免过多的应用重启。
唯一找到介绍JRebel
实现原理的就只有这一篇译文:《HotSwap
和JRebel
原理》https://www.bbsmax.com/A/gAJGemM3dZ/
。