分享

tomcat JDK扩展DCEVM让WEB程序完全不重启调试

 一本正经地胡闹 2019-08-30

目前JDK默认支持对方法体内部的修改,可以重新自动加载。所以在WEB工程中,可以不重启WEB容器的情况下修改方法体内部的实现,进行程序调试。但是很多时候需要新增实例变量和方法,这个时候,默认的JDK就不能支持。

这里推荐一个动态代码扩展的VM:The Dynamic Code Evolution Virtual Machine,可以实现不重启WEB容器的情况下,新增实例变量和方法,并动态reload后进行调试。

官方下载:http://ssw./dcevm/binaries/

官方介绍:

The Dynamic Code Evolution Virtual Machine (DCE VM) is a modification of the Java HotSpot(TM) VM that allows unlimited redefinition of loaded classes at runtime. The current hotswapping mechanism of the HotSpot(TM) VM allows only changing method bodies. Our enhanced VM allows adding and removing fields and methods as well as changes to the super types of a class.

一般开发环境是windows 较多,下载WIN版本进行配置。

官方说JDK1.6的update26不兼容,之后的应该都可以,我使用update29是OK的。

我测试发现,直接使用JDK1.6_update29或以上的几个版本,使用Jetty和tomcat都可以实现实例变量和方法级的变更自动reload。但是Eclipse3.7版本IDE对修改后的JDK不兼容。所以,这里采用的方案是,ECLIPSE-IDC使用独立的原生JDK,开发工程和调试器使用扩展后的JDK,所以这里使用2个JDK。

配置方案:

  • ECLIPSE-IDE运行环境:jdk1.6.0_38 (原生)

  • 工程使用的编译环境和调试环境:jdk1.6.0_29(dcevm扩展)

1.安装2个JDK

首先安装两个JDK版本,要求在JDK1.6update26以上,官方推荐JDK1.7,但是我还是暂时使用JDK1.6版本。怎么安装这里就省略了。我分别安装的是JDK1.6的update29和update38,统一安装在d:\tools\java下面。安装目录分别为:D:\tools\java\jdk1.6.0_29和D:\tools\java\jdk1.6.0_38。

2.配置环境变量

配置操作系统JAVA环境变量,用于IDE或JAVA程序的运行时环境。

JAVA_HOME=D:\tools\java\jdk1.6.0_38

PATH=%JAVA_HOME%\bin;...

3.安装dcevm扩展到编译和调试JDK

运行dcevm扩展jdk1.6.0_29,用于工程编译和调试JDK。

进入已经下载的dcevm-*-win.jar所在目录,运行启动配置界面。

E:\tools\develop\java > java -jar dcevm-0.2-win.jar

会弹出安装界面,直接点击对应的JDK和JRE,然后点击安装即可。安装程序会备份原始JDK的 bin/client/jvm.dll and bin/server/jvm.dll文件,并使用一个修改版本替换,然后添加dcevm.jar到lib/ext/下,实现原始JVM的扩展。而且这个可以卸载和还原的。 

下图所示,我操作系统中安装了多个JDK,选择作为工程编译和调试的jdk1.6.0_29版本安装dcevm,然后点击“Test Instanllation”测试,测试通过即可,如果以后不想使用或换版本,可以卸载还原。


 

4.打开ECLIPSE-IDC进行配置

配置工程编译的JDK和JRE,这里选择已经dcevm扩展后的jdk1.6.0_29


 

 

  如果使用maven+jetty的方式调试,则配置调试的JDK选择jdk1.6.0_29(dcevm)



 

如果使用tomcat插件,则配置VM选项为jdk1.6.0_29(dcevm)



 

好了,配置完成,你可以直接使用你喜欢的方式调试工程,最重要的是修改调试的JDK为dcevm扩展版本。

最后, 最好只用在开发环境,很方便,很快,生产环境就算了哈。

希望对你又帮助!~


TOMCAT和jetty都可以,我在团队推广了,他们有用tomcat.6.x和7.x可以.jetty6-8我一直使用,都可以。但团队也有说不可以的情况,我看了下,一般是基于spring容器的代码变动,因为需要依赖spring容器从新加载,那是不可以的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多