使用 Jrebel,实现热部署
JRebel 是一套 JavaEE 开发工具。JRebel 允许开发团队在有限的时间内完成更多的任务修正更多的问题,发布更高质量的软件产品。
什么是热部署?
所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于 Java 应用程序来说,热部署就是在运行时更新 Java 类文件。
在基于 Java 的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于 Java 的应用服务器,包括 EJB 服务器和 Servlet 容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
Jrebel 介绍
官网:https://manuals.jrebel.com/jrebel/
JRebel 是一个 JVM Java 代理,它与应用程序服务器集成,从而使类可以使用现有的类加载器重新加载。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中。
Jrebel 功能
Jrebel 可以实现基于类、XML 文件的增删查改,也能够实现方法体的增删查改的热部署。
JRebel 工作在与 HotSwap 不同的一个抽象层面上。鉴于 HotSwap 是工作在虚拟机层面上,且依赖于 JVM 的内部运作,JRebel 用到了 JVM 的两个显著的功能特征 —— 抽象的字节码和类加载器。类加载器允许 JRebel 辨别出类被加载的时刻,然后实时地翻译字节码,用以在虚拟机和可执行代码之间创建另一个抽象层。
支持类别 | Jrebel | JVM Hot Swap |
---|---|---|
方法体内代码的修改 | 支持 | 支持 |
方法参数、名称、返回值的变动 | 支持 | 不支持 |
方法体注解的变动 | 支持 | 不支持 |
新增、删除 N (N>0) 个方法 | 支持 | 不支持 |
类的增删查改,其他类对此新增类的引用 | 支持 | 不支持 |
新增接口,以及它的实现类 | 支持 | 不支持 |
改变静态字段值(仅 static) | 不支持 | 不支持 |
改变常量字段值(final static or final) | 支持 | 不支持 |
枚举类 / 值(增删查改),并对它调用 | 支持 | 不支持 |
Jrebel 安装
安装 Jrebel
参考:https://manuals.jrebel.com/jrebel/ide/index.html
破解 Jrebel
- 点击打开网站:http://mynight.top:10086,复制第二行链接
- 至此 Jrebel 全部破解完毕。
Jrebel 注意事项
每次重新编译加载 classes 文件的时候,控制台 console 都会输出一段文字:
(2018-03-30 10:49:53 JRebel: Reloading class “包名。类名.class”.)
这段文字代表该类已经重加载完毕,请确保这段文字输出以后,再调试。
以 Spring boot,启动的项目需要注意:
执行重新编译(recompile)类的时候,需要注意 被编译类 的依赖顺序。例如:A 类实现了 B 接口(类 A 和接口 B 都被修改的前提下),那么需要先重新编译(recompile)B 接口
再重新编译(recompile)A 类。当然,如果只修改了类 A 的内容,接口 B 未做修改,则只需要重新编译(recompile)类 A