【转】java热部署,即改即看
写java代码 时候打包部署是个很头疼的问题,很是打击写代码的士气,decvm的使用能够很好的提高开发自测的效率,尤其是web类应用。收集了java中间件团队和阿里巴巴团队的两片博客,对于这个的使用做了介绍,希望做java web开发的可以使用一下呵呵。
----------------------------------------------------------------------------------------
关于hotswap(该补丁的网址http://ssw.jku.at/dcevm/)
Hotswap 是一个允许在运行状态下无限制的修改加载类文件的Java虚拟机补丁。当前java虚拟机的动态加载机制只允许修改类的方法体,而打了hotswap补丁以后,可以增加,删除类属性,方法,甚至可以改变一个类的父类。
Hotswap补丁是基于GPL v2.0开源协议的。你可以通过windows,linux,mac os下载hotswap 补丁的源代码或者可执行文件。
安装hotswap
警告: 该补丁目前还处于试验阶段. 当该补丁用于调试java程序使用是,是相当稳定的。但我们不提倡在生产环境中使用该补丁。
现在提供了 32位, 64位 Windows虚拟机, 32位 Mac OS的 (从这里获得), 和32位 Linux 虚拟机的补丁. 所有的修改基于 JDK7-b102版本。
安装程序
- dcevm-0.2-win.jar (5.6 MB)
- dcevm-0.2-mac.jar (6.0 MB)
- dcevm-0.2-linux.jar (5.8 MB)
该补丁不仅能打在java7上,且打到java 6上,也一样正常工作。
在windows 启动安装程序,在控制台输入:> java -jar dcevm-0.2-win.jar
在Mac OS启动安装程序,终端输入:$ sudo java -jar dcevm-0.2-mac.jar
在Mac OS启动安装程序,终端输入:$ sudo java -jar dcevm-0.2-linux.jar
安装程序会替换掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,并将以后的jvm.dll备份到相应目录下。还会将dcevm.jar 加到lib/ext/ 目录.
图一:hotswap补丁安装界面。
执行上述命令后,就会出现图一界面,选择将要安装该补丁的java目录,单击安装就可以了。
Ps:如果你的Linux没有图形界面,您可以从这里下载已经打好补丁的java。
使用hotswap调试java程序
- 首先用修改后的java以debug模式启动 java程序。
- 使用eclipse连接到该java进程(也可以直接在eclipse中以debug方式启动)
- 现在在eclipse 工程下面针对class文件的任何修改将会直接反映到java程序中去。
hotswap在淘宝
令我们高兴的是,淘宝开发人员对该技术有着强烈的兴趣,目前已有如下团队使用的该补丁:Mytaobao开发团队,TDDL(Rtools)开发团队,HSF开发团队,交易中心等团队。
------------------------------------------------------------------------------------------------
目前,国际站目前还是主要在几个应用上,一个应用多的有三四十万行代码。几乎所有的产品线在这个应用上都有代码;采用分支开发,要改的代码可能只有一点也要Check out出整个工程的代码来。
这样大工程,对于开发效率的影响很大,编译一下10分钟,启动一下5分钟。苦闷的等待是时间的浪费,另一方面也是打断了开发的节奏。开发过程中,每修改了一点内容,就要编译工程、重启应用来验证。每个开发员都会要频繁重启,浪费总量上是巨大的。
当然解决大应用的关键是拆根据功能拆分成小应用,这件事国际站也在积极进行中。
Hot Swap可以在Debug时让对源文件的修改立即生效,减少编译和重启的次数,节省开发时间浪费。
Java虚拟机的缺省的Hot Swap机制只允许修改类的方法体,这个限制太大。
DCE(the Dynamic Code Evolution VM)是一个允许在运行状态下无限制的修改加载类文件的Java虚拟机补丁,即Hot Swap的加强。使用DCE以后,可以
- 增加、删除 类的属性、方法
- 改变一个类的父类
这样的加强,完全满足平时开发时需要。DCE是基于GPL v2.0开源协议的。你可以通过Windows,Linux,Mac OS下载DCE的源代码或者可执行文件。
下面记录了DCE使用中遇到的和整理了网上提到的对DCE的问题及其解决。
DCE注意
Linux下,DCE目前只支持32位JVM,不支持64位JVM。
与JDK 1.6 update 26有兼容问题,使用JDK 1.6 update 25。
# 参见官网 http://ssw.jku.at/dcevm/binaries/ 的说明。
问题及其解决方法
下面是在国际站开发环境集成DCE的过程中,收集的问题以及解决方法的记录总结和汇总。
1. 和asm、cglib相关的jar包冲突。
异常:
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47) at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24) at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104) at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117) at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
参见DCE的JIRA http://kenai.com/jira/browse/DCEVM-4
原因:dcevm.jar文件中包含了一份ASM类,版本较老,并优先加载。(阿干发现这个问题,并给出重命名包名的解决方法)
解决方法1:
重命名dcevm.jar文件中asm的包名,从 org.objectweb.asm 重命名成 dce.org.objectweb.asm。
# 在Jar文件上重命名包名 使用工具: JarJar(http://code.google.com/p/jarjar/)。
解决方法2:
asm、cglib换成了新的版本:asm-3.3.1.jar、cglib-nodep-2.2.jar。
asm、cglib各版本匹配注意点:
asm 1.5.3.jar 匹配 cglib-2.1.3.jar
asm-2.X.jar asm-3.x.jar 匹配 cglib-nodep-2.1_3.jar
2. 动态添加的static属性,例如 private static String attrib1 = "x",调用时会显示attrib1是null。
3. 在一个正在执行的循环中,改变可能不能生效。例如:
public static void main(String[] args) { for (int i = 0; i < 10000; i++) { test(); //sleep 1s and print something } }
修改为:
public static void main(String[] args) { for (int i = 0; i < 10000; i++){ test(); System.out.println("xxx"); } }
xxx是不能输出的。
但test方法体内部的修改是可以生效的。例如:
public static void main(String[] args) { System.out.println("xxx"); for (int i = 0; i < 10000; i++) { test(); } }
5. Crash when running maven test goal with jmockit
参见DCE的JIRA http://kenai.com/jira/browse/DCEVM-3
6. DCEVM启动报错
Must use the serial GC in the Dynamic Code Evolution VM Could not create the Java virtual machine.
把JAVA启动参数中并发GC的选项删除,如:
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10
开发模式下,修改这些选项不会有功能上的影响。
一些参考资料
- DCE官方网址 http://ssw.jku.at/dcevm/
- hotswap 用户手册 – 淘宝JAVA中间件团队博客http://rdc.taobao.com/team/jm/archives/641
- hostswap dcevm – 使用介绍http://www.cnblogs.com/redcreen/archive/2011/06/03/2071169.html
- Dynamic Code Evolution for Java dcevm 原理http://www.cnblogs.com/redcreen/archive/2011/06/14/2080718.html
- Java HotSpot dcevm 在debug模式下的热部署http://sjsky.iteye.com/blog/907606
- 深入 Java 调试体系 http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/
- Java Platform Debugger Architecturehttp://java.sun.com/javase/technologies/core/toolsapis/jpda/