我试图将Java代理加载到正在运行的JVM中。我有JVMs PID,但每当我尝试将代理加载到JVM时,我都会收到错误com.sun.tools.attach.AgentLoadException: Agent JAR not found or no Agent-Class attribute
。两个文件都在同一目录中。我使用javac JavaAgent.java
和jar cmf manifest.txt JavaAgent.jar *.class
编译该类并将该类打包到JAR存档中。任何帮助将不胜感激,提前谢谢。
AgentInstaller
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: Agent JAR loaded but agent failed to initialize
。我正在运行Oracle JDK。
答案 0 :(得分:1)
在agentPath
中指定完整的绝对路径。
清单应命名为MANIFEST.MF
Agent-Class
应该是代理的完全限定类名:com.company.JavaAgent
。
答案 1 :(得分:0)
此错误(已加载代理JAR但代理无法初始化)未提供足够的信息以查看代理引发异常的位置。 完整的堆栈跟踪显示在另一端 - 您尝试附加到的JVM。
将代理程序附加到某些将显示代理程序输出的JVM。
简单的选项是kotlinc
(Kotlin编译器 - 它的控制台在交互模式下等待)。然后附加代理程序,堆栈跟踪将出现在kotlinc控制台中。
使用修改后的代理关闭目标JVM ,然后再尝试。否则,将不会应用更改。