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 AGENT9:49:29.548 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent -unlimited runtime class redefinition.

HOTSWAP AGENT9: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 AGENT9: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

原文地址:https://www.cnblogs.com/enncloudcn/p/6846387.html