Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行在eclipse之外的Tomcat web应用程序中执行热代码替换?_Java_Tomcat_Jvm - Fatal编程技术网

Java 如何在运行在eclipse之外的Tomcat web应用程序中执行热代码替换?

Java 如何在运行在eclipse之外的Tomcat web应用程序中执行热代码替换?,java,tomcat,jvm,Java,Tomcat,Jvm,当Tomcat在eclipse上运行时,我正在使用热代码替换特性,它工作得很好 但是,当Tomcat在eclipse之外运行时,如何手动执行此操作 经过一些搜索,我发现我需要使用一个代理,比如HotswapAgent。但是,他们将这个代理与修改后的JDK一起使用,称为DCEVM。我不想使用修改过的JDK。我想用OpenJDK实现同样的目标 我知道修改只限于方法体,但这对我来说不是问题。在不使用IDE的情况下,如何实现eclipse为外部运行Tomcat的热代码替换所做的完全相同的事情 编辑:Ec

当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 创建用于给定类的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