Free HTML5 by FreeHTMl5.co 2018-03-30 11:47:24

使用Jrebel,实现"完全"热部署

-------------------------------------我是一条正文分割线-------------------------------------

使用Jrebel,实现”完全”热部署


目录


正文

1、什么是热部署?

所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。

2、为什么选择 jrebel?

2007年,ZeroTurnaround宣布提供一种被称作JRebel(当时是JavaRebel)的工具,该工具可以在无需动态类加载器的情况下更新类,且只做极少的限制。不像HotSwap只能在方法体内热部署以及依赖于IDE的集成,这一工具的工作方式是,监控磁盘上实际已编译的.class文件,无论何时只要有文件被更新就更新类。这意味着如果愿意的话,你可以把JRebel和文本编辑器、命令行的编译器放在一起使用。当然,它也被巧妙地整合到了Eclipse、InteliJ和NetBeans中。与动态的类加载器不一样,JRebel保留了所有现有的对象和类的标识和状态,允许开发者继续使用他们的应用而不会产生延迟。

jrebel可以实现基于类、XML文件的增删查改,也能够实现方法体的增删查改的热部署

经对 Jrebel 和 Spring-boot-devtools 两款热部署的测试比较:(针对云音乐Musician项目)

不用热部署插件: 每次修改源代码,需要重新启动musician项目。

spring-boot-devtools: 修改源代码后,仍会对大部分的class类进行加载,大约能减少一半重重启时间。且支持范围不如Jrebel

Jrebel: 可自由修改源码,无需修改源码,只会重新加载修改的类

下面是我对jrebel适用范围做的测评,大家可以参考( 更详细的请跳转 5.2 Jrebel 注意事项

支持类别 Jrebel JVM Hot Swap
方法体内代码的修改 支持 支持
方法参数、名称、返回值的变动 支持 不支持
方法体注解的变动 支持 不支持
新增、删除N(N>0)个方法 支持 不支持
类的增删查改,其他类对此新增类的引用 支持 不支持
新增接口,以及它的实现类 支持 不支持
改变静态字段值(仅static) 不支持 不支持
改变常量字段值(final static or final) 支持 不支持
枚举类/值(增删查改),并对它调用 支持 不支持
。。。

Jrebel的实力是这样的强大,使用它。能够在编程时避免中断思路,而且能大幅度节省重启项目的时间。将更多的时间用于Coding,

下面是jrebel的安装、破解、以及使用的过程

3、jrebel配置安装及激活

原先的Jrebel账号免费激活通道已经关闭,大家可以通过
window: JRebel 7.1.5 插件下载 安装 激活 结合 IntelliJ IDEA进行破解。
Mac&&Linux : IDEA插件JRebel安装配置与破解激活详细教程 进行破解。
(安装、使用过程有问题可以POPO我:taohaowei@corp.netease.com)

4、使用过程

4.1 以tomcat为容器,启动项目的使用过程

使用tomcat为容器启动项目的时候,需要进行如下的配置:

image
image
image
image
image
image
配置完成以后,在容器启动的时候更新代码,只需切出idea软件,jrebel的热部署会随着idea自动保存代码的同时更新classes文件。

4.2 以Spring Boot,启动项目的使用过程

安装完成后,重启idea,上部启动栏会多两个绿色的按钮。
image
image
image
image
image

5、Jrebel适用范围以及注意事项

5.1 Jrebel适用范围.

Java EE Support Jrebel JVM Hot Swap
Time to reload < 1s < 1s
No memory leak YES YES
Changes to method bodies YES YES
Adding/removing Methods YES NO
Adding/removing constructors YES NO
Adding/removing fields YES NO
Adding/removing classes YES NO
Adding/removing annotations YES NO
Changing static field value YES JRebel 3.0+ NO
Adding/removing enum values YES JRebel 3.0+ NO
Changing interfaces YES NO
Replacing superclass NO NO
Adding/removing implemented interfaces NO NO
Skip builds for WAR directories YES YES
Skip builds for .WAR/.EAR class updates YES YES
Skip builds for .WAR/.EAR resource updates YES NO
Map multiple source dirs to one .WAR/.EAR target dir YES NO
Map classes and resources with include/exclude patterns YES NO
Map multiple source dirs with Ant-style patterns YES NO
Use system properties to make mapping machine-independent YES NO
Maven plugin YES NO
JSP EL changes YES NO
JSP Scriptlet changes YES Enterprise Add-on NO
EJB 1.x session bean interface changes YES Enterprise Add-on NO
EJB 2.x session bean interface changes YES Enterprise Add-on NO
EJB 3.x session bean interface changes YES JRebel 3.0+ NO
JSF changes (Mojarra) YES JRebel 3.0+ NO
JPA changes (Hibernate, EclipseLink, TopLink, OpenJPA) YES JRebel 3.0+ NO
CDI changes (Weld) YES JRebel 3.0+ NO
ResourceBundle YES NO
Spring Framework 2.x or later YES NO
Hibernate YES JRebel 3.0+ NO
JBoss Seam 2.x or later YES JRebel 3.0+ NO
Google Guice YES NO
Stripes 1.x or later YES NO
Apache log4j 1.2.x or later YES NO
Apache Struts 1.x YES NO
Apache Struts 2.x or later YES NO
Apache Tapestry4 YES NO
Apache Velocity YES NO
Apache Wicket YES NO
CgLib YES JRebel 3.0+ NO
Javassist YES JRebel 3.0+ NO
Atlassian Confluence plugins YES NO
ClassWorlds YES Beta NO
Apache Felix YES Beta NO
Eclipse Equinox YES Beta NO
IntelliJ IDEA 7.x, 8.x plugins YES Beta NO
NetBeans plugins YES Beta NO

5.2 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

6、热部署的拓展知识

1、HotSwap和JRebel原理

2、服务器热部署的实现原理

(完)