`
iamzhongyong
  • 浏览: 797178 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【转】java热部署,即改即看

    博客分类:
  • 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版本。

安装程序

该补丁不仅能打在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程序

  1. 首先用修改后的java以debug模式启动 java程序。
  2. 使用eclipse连接到该java进程(也可以直接在eclipse中以debug方式启动)
  3. 现在在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

开发模式下,修改这些选项不会有功能上的影响。

 

一些参考资料

分享到:
评论
1 楼 thebye85 2012-02-28  
jrebel也不错,配置很简单

相关推荐

    支持Java热部署的插件

    这是一个支持热部署的软件,在Java项目中修改Java代码不需在重启服务器。一个很实用的Java编程软件

    java开发热部署

    有没有在为修改java代码 反复重启tomcat而烦恼 下载热部署一切不成问题。内容:1.热部署 2.分给myeclipse 1g内存

    深入探索 Java 热部署

    在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的...

    tomcat热部署+操作文档,修改任何java后台文件也不需要重启

    tomcat热部署,压缩包有操作说明文档。解压配置直接使用。写代码时有的时候修改后台配置文件需要重启服务器才能识别,有了热部署修改任何j后台文件也不需要重启,

    热部署jrebel

    jrebel热部署,修改前端代码,Java代码,xml配文件,properties文件不用重新部署项目和重启服务器。真的好用,本人已验证使用。 jrebel热部署,修改前端代码,Java代码,xml配文件,properties文件不用重新部署项目...

    eclipse修改代码后热部署(不需要重启服务

    用eclipse开发开发web程序时候,修改代码了,每次都得重启,很不方便,我在网上找了好久,发下这个可以用!分享下经验! 没有图片哦

    深入探索Java热部署

     在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次...

    Springboot中html修改,不用重启(热部署).md

    Springboot中html修改,不用重启(热部署).md

    JAVA代码热部署,在线不停服动态更新

    本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署。  JDK代理的两种方式:  1.premain方式是Java SE5开始提供的代理方式,但其必须在命令行指定代理jar,并且代理类...

    idea 热部署

    JRebel 是一款热部署插件。当你的 java-web 项目在 tomcat 中 run/debug 的时候 ,修改某一个 java 文件时,tomcat 并不能将此文件的修改 实时编译 并反映到运行的项目中去。JRebel 就可以解决在项目运行状态run/...

    eclipse jee 热部署配置图解

    eclipse jee 热部署配置图解 修改 jsp 和 java 文件 不用重启tomcat 热部署 三步搞定:

    myeclipse热部署

    myeclipse热部署,解压后就可以用,tomcat的JDK添加一段简单的代码就可以了。修改sql,java不需要重启项目了,好东西给大家分享,具体的写在文档里,放压缩包里了

    Tomcat实现热部署

    热部署是指在你对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效,配置文件的修改除外 热部署好处 每次打增量包的时候就不用重新启动tomcat了 实现方式 在tomcat\conf\server.xml中的&lt;host&gt;&lt;/host&gt;内部...

    Jrebel插件-热部署

    资源为破解版的Jrebel热部署插件,在eclipse中配置好了以后,修改java文件无需再重启项目

    idea jrebel1.7免费版热部署插件

    java-web修改配置文件免重启工具,实现热部署功能,提高开发效率

    jrebel 不用重启,直接改直接用 ,可改java类和配置文件

    NULL 博文链接:https://ch-dj.iteye.com/blog/1825362

    IDEA JRebel热部署插件jar包

    IDEA的 JRebel热部署插件, 修改后无需重启项目

    热部署.rar

    该压缩文件包含一个word文档和文件,文档里面有操作步骤。该操作主要用于解决eclipse修改代码后tomcat总是重启问题

    Java开发Web程序中修改类文件和配置文件不重启服务器的方法

    Java开发Web程序中修改类文件和配置文件不重启服务器的方法 大家知道,在我们开发web项目的时候重启应用服务器是我们最烦恼的事情,每次修改类文件或者配置文件后,我们必须重启服务器来重新加载,使得我们的修改...

    jrebel热部署工具-eclipse

    web开发,修改java文件之后,就得重新部署或者重新启动tomcat.

Global site tag (gtag.js) - Google Analytics