Java 如何在运行在eclipse之外的Tomcat web应用程序中执行热代码替换?
当Tomcat在eclipse上运行时,我正在使用热代码替换特性,它工作得很好 但是,当Tomcat在eclipse之外运行时,如何手动执行此操作 经过一些搜索,我发现我需要使用一个代理,比如HotswapAgent。但是,他们将这个代理与修改后的JDK一起使用,称为DCEVM。我不想使用修改过的JDK。我想用OpenJDK实现同样的目标 我知道修改只限于方法体,但这对我来说不是问题。在不使用IDE的情况下,如何实现eclipse为外部运行Tomcat的热代码替换所做的完全相同的事情Java 如何在运行在eclipse之外的Tomcat web应用程序中执行热代码替换?,java,tomcat,jvm,Java,Tomcat,Jvm,当Tomcat在eclipse上运行时,我正在使用热代码替换特性,它工作得很好 但是,当Tomcat在eclipse之外运行时,如何手动执行此操作 经过一些搜索,我发现我需要使用一个代理,比如HotswapAgent。但是,他们将这个代理与修改后的JDK一起使用,称为DCEVM。我不想使用修改过的JDK。我想用OpenJDK实现同样的目标 我知道修改只限于方法体,但这对我来说不是问题。在不使用IDE的情况下,如何实现eclipse为外部运行Tomcat的热代码替换所做的完全相同的事情 编辑:Ec
编辑:Eclipse示例只是为了阐明我想要实现的目标。我根本不想使用eclipse。我只想在Tomcat中运行的应用程序中执行热代码替换。是的,可以在运行的JVM中执行热代码替换。这包括几个步骤 准备编译要替换的类的新版本。比方说,您想替换org.pkg.MyClass,而这个类的新版本位于/new/path/org/pkg/MyClass.class 创建用于给定类的Java代理。下面是最简单的代理的外观:
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
创建HotCodeReplace.jar的命令:
将agent.jar加载到目标JVM中。这可以通过或仅通过实用程序完成:
为什么不重新部署一场新的战争?
Agent-Class: HotCodeReplace
Can-Redefine-Classes: true
jar cvfm HotCodeReplace.jar MANIFEST.MF HotCodeReplace.class
jattach <pid> load instrument false /path/to/HotCodeReplace.jar