我正在尝试将 Java 代理加载到正在运行的 JVM 中。我有 JVM PID,但每当我尝试将代理加载到 JVM 中时,都会收到错误 com.sun.tools.attach.AgentLoadException:未找到代理 JAR 或没有代理类属性
。两个文件位于同一目录中。我使用 javac JavaAgent.java
和 jar cmf manifest.txt JavaAgent.jar *.class
编译该类并将该类打包到 JAR 存档中。任何帮助将不胜感激,提前致谢。
代理安装程序
package com.company;
import com.sun.tools.attach.*;
import java.io.IOException;
public class AgentLoader {
public static void loadAgent() {
String agentPath = "JavaAgent.jar";
System.out.println("Dynamically loading java agent");
String pid = "9484";
try {
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent(agentPath);
vm.detach();
}
catch (Exception e){
throw new RuntimeException(e);
}
}
}
JavaAgent
package com.company;
import java.lang.instrument.Instrumentation;
class JavaAgent {
private static Instrumentation instrumentation;
public static void agentmain (String args, Instrumentation inst){
System.out.println("Java Agent inserted");
}
}
Manifest.txt
Main-Class: com.company.MyMainClass
Agent-Class: com.company.AgentLoader
Can-Redefine-Classes: true
Can-Retransform-Classes: true
<小时/>
更新
感谢 apangin,我现在可以加载代理,但无法初始化com.sun.tools.attach.AgentInitializationException:代理 JAR 已加载,但代理无法初始化
。我正在运行 Oracle JDK。
最佳答案
在agentPath
中指定完整的绝对路径。
list 应命名为MANIFEST.MF
Agent-Class
应该是代理的完全限定类名:com.company.JavaAgent
。
关于Java 代理不会加载到 JVM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169134/