Java代理不会加载到JVM中

时间:2016-10-21 05:37:22

标签: java jvm

我试图将Java代理加载到正在运行的JVM中。我有JVMs PID,但每当我尝试将代理加载到JVM时,我都会收到错误com.sun.tools.attach.AgentLoadException: Agent JAR not found or no Agent-Class attribute。两个文件都在同一目录中。我使用javac JavaAgent.javajar 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。

2 个答案:

答案 0 :(得分:1)

agentPath中指定完整的绝对路径。

清单应命名为MANIFEST.MF

Agent-Class应该是代理的完全限定类名:com.company.JavaAgent

答案 1 :(得分:0)

此错误(已加载代理JAR但代理无法初始化)未提供足够的信息以查看代理引发异常的位置。 完整的堆栈跟踪显示在另一端 - 您尝试附加到的JVM。

将代理程序附加到某些将显示代理程序输出的JVM。 简单的选项是kotlinc(Kotlin编译器 - 它的控制台在交互模式下等待)。然后附加代理程序,堆栈跟踪将出现在kotlinc控制台中。 使用修改后的代理关闭目标JVM ,然后再尝试。否则,将不会应用更改。