gpt4 book ai didi

java - 如何在 eclipse 外部运行的 Tomcat Web 应用程序中执行热代码替换?

转载 作者:行者123 更新时间:2023-12-02 08:46:48 25 4
gpt4 key购买 nike

当 Tomcat 从 eclipse 运行时,我正在使用热代码替换功能,并且效果很好。

但是,当 Tomcat 在 Eclipse 外部运行时,如何手动执行此操作?

经过一番搜索,我发现我需要使用像HotswapAgent这样的代理。但是,他们使用的代理是经过修改的 JDK(称为 DCEVM)。我不想使用修改过的 JDK。我想用 OpenJDK 实现同样的目标。

我知道修改仅限于方法体,但这对我来说不是问题。如何在不使用 IDE 的情况下实现 Eclipse 对外部运行的 Tomcat 的热代码替换所做的完全相同的事情?

编辑:Eclipse 示例只是为了阐明我想要实现的目标。我根本不想使用eclipse。我只想在 Tomcat 中运行的应用程序中执行热代码替换。

最佳答案

是的,可以在正在运行的 JVM 中执行热代码替换。这涉及几个步骤。

  1. 准备(编译)要替换的类的新版本。假设您想要替换 org.pkg.MyClass ,该类的新版本位于 /new/path/org/pkg/MyClass.class
  2. 创建一个使用 Instrumentation API 的 Java 代理至redefine给定的类(class)。最简单的代理如下所示:

    import java.lang.instrument.*;
    import java.nio.file.*;

    public class HotCodeReplace {

    public static void agentmain(String args, Instrumentation instr) throws Exception {
    Class oldClass = Class.forName("org.pkg.MyClass");

    Path newFile = Paths.get("/new/path/org/pkg/MyClass.class");
    byte[] newData = Files.readAllBytes(newFile);

    instr.redefineClasses(new ClassDefinition(oldClass, newData));
    }
    }
  3. 编译上述代理并打包到 .jar具有以下MANIFEST.MF

    Agent-Class: HotCodeReplace
    Can-Redefine-Classes: true

    创建 HotCodeReplace.jar 的命令:

    jar cvfm HotCodeReplace.jar MANIFEST.MF HotCodeReplace.class
  4. 将代理 .jar 加载到目标 JVM 中。这可以通过 Attach API 来完成或者简单地使用 jattach 效用:

    jattach <pid> load instrument false /path/to/HotCodeReplace.jar

More about Java agents »

关于java - 如何在 eclipse 外部运行的 Tomcat Web 应用程序中执行热代码替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61024212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com