1001种玩法 | HotswapAgent:支持无限次重定义运行时类与资源
Java运行时无限制的类和资源的重定义。新智云(www.enncloud.cn)
HotSwapAgent 项目的主要目的是避免臭名昭著的开发周期,即“更改->重启+等待->检测”。在开发期间保存并重新加载是标准的流程,而且其他语言(包括C#)也有这种流程。
功能特性
-
扩展的 Hotswap可以更改方法体,增加或重命名某个方法和字段等。HotswapAgent无法做到的是层级改动(比如更改超类或者是移除接口)。
-
你可以在集成桌面开发环境的debug模式下,通过使用标准的Java Hotswap来重新加载被更改的类。
-
也可以在编辑完成后,通过设置Hotswap的自动属性(-XXaltjvm=dcevm -javaagent:PATH_TO_AGENT\hotswap-agent.jar=autoHotswap=true)来重新加载被更改的类。该设置甚至不用重启就可以在产品系统上完成重新加载。
-
自动配置 – 在运行时的Java应用程序中登记过的所有本地类和资源都被监控,以便重新加载(在本地文件系统中的所有文件,但不包括JAR包中的文件)。
-
额外的classpath – 如果某个运行时类在依赖的JAR包中,那么 需要更改该运行时类?使用额外的classpath属性可以添加任何目录作为classpath,以便监测这些路径中的类文件。
-
在作出修改后要重新加载资源 – 应用服务器通常重新加载来自网页应用目录中的资源。但是其他的资源(比如src/main/resources)是如何重载的?使用watchResource属性可以添加任何路径来监测资源的改动。
-
支持框架 – 通过插件系统,许多框架都是被支持的。新的插件可以被轻松的添加。
-
快速 – 在插件被初始化之前,它是不会消耗任何资源或是让应用变慢的(阅读运行时的开销,你可以了解更多这方面的信息)。
下载
https://github.com/dcevm/dcevm/releases
提供了JAR文件及源代码下载。
快速上手
安装
下载latest release of DCEVM Java patch,并启动安装程序(比如,java -jar installer-light.jar)。目前你需要为Java主版本(7/8)选择合适的安装程序。
在你的硬盘上选择一个安装java的目录,并点击“Install DCEVM as altjvm”按钮。1.7以上的Java版本都是支持的。
下载latest release of Hotswap agent jar,解压hotswap-agent.jar,解压内容可以放在你的硬盘上的任何位置(例如,C:\java\hotswap-agent.jar)。
运行你的应用程序
1.添加接下来的命令行java属性:-XXaltjvm=dcevm -javaagent:PATH_TO_AGENT\hotswap-agent.jar(你需要用实际的路径替换PATH_TO_AGENT)。比如java路径,那么就是-XXaltjvm=dcevm -javaagent:c:\java\hotswap-agent.jar。想要了解更多的IDE具体的设置指南,可以查看IntelliJ IDEA 和 Netbeans 论坛上的线索。如果你的应用已经在运行了,你仍可以使用示例code snippet来附加agent jar包。
2.(可做可不做)在你的资源路径中创建一个名为”hotswap-agent.properties”的文件,想要查看可用的属性和默认值:可以参阅https://github.com/HotswapProjects/HotswapAgent/blob/master/hotswap-agent-core/src/main/resources/hotswap-agent.properties。
3.在debug模式下启动应用程序,并参考一下来检测代理和插件是否被正确初始化:
HOTSWAP AGENT: 9:49:29.548 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent -unlimited runtime class redefinition.
HOTSWAP AGENT: 9:49:29.725 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins:[org.hotswap.agent.plugin.hotswapper.HotswapperPlugin,org.hotswap.agent.plugin.jvm.AnonymousClassPatchPlugin,org.hotswap.agent.plugin.hibernate.HibernatePlugin, org.hotswap.agent.plugin.spring.SpringPlugin,org.hotswap.agent.plugin.jetty.JettyPlugin, org.hotswap.agent.plugin.tomcat.TomcatPlugin,org.hotswap.agent.plugin.zk.ZkPlugin, org.hotswap.agent.plugin.logback.LogbackPlugin]
...
HOTSWAP AGENT: 9:49:38.700 INFO (org.hotswap.agent.plugin.spring.SpringPlugin) - Spring plugininitialized - Spring core version '3.2.3.RELEASE'
4.保存某个被修改了的资源,和/或 使用你IDE的HotSwap特性来重新加载被修改了的内容。
配置
做完那些基本配置后,就可以从classpath着手重新加载类和资源了,该classpath已被运行时应用程序(classloader类加载器)所知。如果你需要一个不同的配置,可以添加hotswap-agent.properties文件到classpath的根路径(比如,src/main/resources/hotswap-agent.properties)。
可用属性和默认值的详细文档可以在agent properties file中找到。
Hotswap agent命令行参数
命令行参数的完整语法是:
-javaagent:[yourpath/]hotswap-agent.jar=[option1]=[value1],[option2]=[value2]
Hotswap agent 接受如下的参数:
-
autoHotswap=true – 监测所有随时可能修改的类文件,并在运行着的应用程序中自动热交换 类(而不是从你的IDE调试窗口运行热交换)。
-
disablePlugin=[pluginName] – 禁止一个插件.注意这个参数会完全禁止插件去加载(hotswap-agent.properties文件中的disablePlugin参数只会为类加载器禁用插件, 这两个参数的作用是相反的。你对每个插件重复使用这个参数可以达到禁止插件的目的)。
使用许可
HotswapAgent遵循GPL-2.0开源协议发布。
开源地址:https://github.com/HotswapProjects/HotswapAgent