文档结构  
可译网翻译有奖活动正在进行中,查看详情 现在前往 注册?
原作者:Vladimir Dvorak/Jiri Bubnik    来源:Dzone [英文]
CY2    计算机    2016-12-22    2评/2166阅
翻译进度:已翻译   参与翻译: CY2 (3)

Hotswap Agent 项目的主要目的是避免可怕的“改程序 -> 重启+等待 -> 检查" 这样的开发周期。在开发的过程中保存代码并重新加载这是一个标准的流程,而且很多语言(包括 C#)都有这样的特性。

目前我们这个项目已经发布 1.0 版本了,值得一试!

特性

与标准的 Java 方法相比较,hotswap 仅限于方法体内的代码改动,DCEVM + HotswapAgent 则允许下列的代码改动方式:

  • 添加/删除/修改 类的属性
  • 添加/删除/修改 方法;添加/删除/修改 方法的注解
  • 添加/删除/修改 类(包括匿名类),HotswapAgent 可正确处理匿名类的重定义
  • 添加/删除 类的静态成员,HotswapAgent 可处理静态成员的初始化问题
  • 添加/删除 枚举值
  • 刷新框架以及应用的服务器设定
第 1 段(可获 1.51 积分)

唯一不支持的操作就是层次结构的改动(例如更改超类或者移除接口)。

DCEVM 是在 JVM 级别上实现的 hotswapping 热交换。而 HotwapAgent 是在 Java 框架和 Servlet 容器中实现相同的功能。当两个项目一期使用时,就可以为你的日常开发提供超棒的体验,不只是 Java ,还包括其他基于 JVM 的脚本语言。

容易上手

下载并安装最新版的 DCEVM Java patch + agent JAR 然后使用 -XXaltjvm=dcevm -javaagent:hotswap-agent.jar 参数来启动应用服务器。你可以附加 agent JAR 到正在运行的 JVM,方法如下:

import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
public class AgentRunner {
    /*
     * This class shows how to attach hotswap-agent.jar to a running JVM process and overload classes using "extraClasspath=" property via Hotswapper plugin.
     *
     * Lets assume that:
     *  args[0] contains pid of running JVM process or a runner class name we want to attach agent to
     *  args[1] contains absolute path to agent.jar
     *  args[2] contains parameters needed to pass to agent
     */
    public static void main(String[] args) {
        if (2 > args.length) {
            System.out.println("Usage: java -cp .:$JAVA_HOME/lib/tools.jar AgentRunner JVM_PID_OR_NAME PATH_TO_JAR [PARAMS]");
        } else try {
            String pid = args[0];
            for (VirtualMachineDescriptor vmd : VirtualMachine.list()) {
                if (vmd.displayName().contains(args[1])) {
                    pid = vmd.id();
                    break;
                }
            }
            final VirtualMachine vm = VirtualMachine.attach(pid);
            vm.loadAgent(args[1], 3 > args.length || null == args[2] ? "" : args[2]);
            vm.detach();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

另外你还可以通过在应用中增加 hotswap-agent.properties 配置文件来定制插件和代理的行为。

第 2 段(可获 1.38 积分)

插件

每一种应用框架 (如 Spring、 Hibernate、 Logback 等) 都需要一个特别的重载机制,以便在类重定义之后保持更新(例如新增一个实体类后 Hibernate 配置的重载)。Hotswap agent 相当于是一个插件系统,作为多数主流框架的插件提供预配置的功能。编写自定义插件是非常容易的,甚至可以是你应用的一部分。

贡献

由于要支持大量的框架和不同的版本,导致该项目非常复杂。因此我们很需要社区的帮助来保持其活力。你可以现在应用中创建一个插件或者编写一个 example/integration 测试。同时我们还需要帮忙完善我们的文档。非常感谢你的任何的帮助。

关于该项目更多详细信息请浏览 http://hotswapagent.org/.

第 3 段(可获 1.5 积分)

文章评论

CY2
这东西还是只适合开发环境,生产环境千万别作死
访客
用过不错