使用 -javaagent 启动 JVM 时,我应该如何在 manifest.mf 中指定我的 Premain-class

How should I specify my Premain-class in manifest.mf when starting JVM with -javaagent

我目前正在尝试使用 Java Instrumentation,我什至无法使用 -javaagent arg 启动 JVM 并收到 ClassNotFoundException。

我有一个名为 TestInstrumentation 的简单测试项目。它有一个 src 文件夹,其中包含一个名为 testinstrumentation 的包。里面是:TestInstrumentation.java 和 TestAgent.jar。

这是我的 TestAgent.jar 的 manifest.mf 的内容:

Manifest-Version: 1.0
Premain-Class: TestAgent
Created-By: 1.8.0_45 (Oracle Corporation)

TestAgent.java:

package testinstrumentation;

import java.lang.instrument.Instrumentation;

public class TestAgent {
    public static void premain(String agentArgument, Instrumentation instrument) {
        System.out.println("Java Agent Loaded!");
    }
}

TestInstrumentation.java:

package testinstrumentation;

public class TestInstrumentation {
    public static void main(String[] args) {
        System.out.println("Main Class");
    }

}

这是我尝试 运行 时的堆栈跟踪:

java.lang.ClassNotFoundException: TestAgent
FATAL ERROR in native method: processing of -javaagent failed
    at java.net.URLClassLoader.run(URLClassLoader.java:372)
    at java.net.URLClassLoader.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:304)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Exception in thread "main" Java Result: 1

我很确定错误出在我的 jar manifest.mf 中的 Premain-class 规范中。任何有关如何更正此问题的建议都将不胜感激!

听起来更像是包装问题。 一般来说,您做对了:您必须在清单中指定以下内容。

Premain-Class: testinstrumentation.TestAgent

当然,testinstrumentation.TestAgent class 文件应该位于同一个 jar 中。 从你的堆栈跟踪我看到它看起来在 src.testinstrumentation 但是你的代码应该放在 测试仪器

我建议您阅读 Not so secret java agents 系列教程(4 部分)。这很好地概述了 java 代理的功能。

希望对您有所帮助