使用 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

1597297821144

破解 Jrebel

  1. 点击打开网站:http://mynight.top:10086,复制第二行链接
  2. 1597297837282
  3. 1597297849629
  4. 1597297856954
  5. 1597297962755
  6. 至此 Jrebel 全部破解完毕。

Jrebel 注意事项

  1. 每次重新编译加载 classes 文件的时候,控制台 console 都会输出一段文字:

    (2018-03-30 10:49:53 JRebel: Reloading class “包名。类名.class”.)

    这段文字代表该类已经重加载完毕,请确保这段文字输出以后,再调试。

  2. 以 Spring boot,启动的项目需要注意:
    执行重新编译(recompile)类的时候,需要注意 被编译类 的依赖顺序。

    例如:A 类实现了 B 接口(类 A 和接口 B 都被修改的前提下),那么需要先重新编译(recompile)B 接口
    再重新编译(recompile)A 类。

    当然,如果只修改了类 A 的内容,接口 B 未做修改,则只需要重新编译(recompile)类 A