作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 Tomcat 从 eclipse 运行时,我正在使用热代码替换功能,并且效果很好。
但是,当 Tomcat 在 Eclipse 外部运行时,如何手动执行此操作?
经过一番搜索,我发现我需要使用像HotswapAgent这样的代理。但是,他们使用的代理是经过修改的 JDK(称为 DCEVM)。我不想使用修改过的 JDK。我想用 OpenJDK 实现同样的目标。
我知道修改仅限于方法体,但这对我来说不是问题。如何在不使用 IDE 的情况下实现 Eclipse 对外部运行的 Tomcat 的热代码替换所做的完全相同的事情?
编辑:Eclipse 示例只是为了阐明我想要实现的目标。我根本不想使用eclipse。我只想在 Tomcat 中运行的应用程序中执行热代码替换。
最佳答案
是的,可以在正在运行的 JVM 中执行热代码替换。这涉及几个步骤。
org.pkg.MyClass
,该类的新版本位于 /new/path/org/pkg/MyClass.class
创建一个使用 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));
}
}
编译上述代理并打包到 .jar
具有以下MANIFEST.MF
Agent-Class: HotCodeReplace
Can-Redefine-Classes: true
创建 HotCodeReplace.jar
的命令:
jar cvfm HotCodeReplace.jar MANIFEST.MF HotCodeReplace.class
将代理 .jar 加载到目标 JVM 中。这可以通过 Attach API 来完成或者简单地使用 jattach
效用:
jattach <pid> load instrument false /path/to/HotCodeReplace.jar
关于java - 如何在 eclipse 外部运行的 Tomcat Web 应用程序中执行热代码替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61024212/
我是一名优秀的程序员,十分优秀!