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

时间:2015-11-16 07:28:50

标签: java instrumentation agent

我目前正在尝试使用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$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.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规范中。任何关于我如何得到纠正的建议都将不胜感激!

1 个答案:

答案 0 :(得分:3)

这听起来更像是一个包装问题。 通常,您可以正确执行此操作:您必须在清单中指定以下内容。

Premain-Class: testinstrumentation.TestAgent

当然,testinstrumentation.TestAgent类文件应该驻留在同一个jar中。 从您的堆栈跟踪中我看到它在 src.testinstrumentation 中查找,但是您的代码应该放入 testinstrumentation 封装

我建议你阅读Not so secret java agents系列教程(4部分)。这提供了对Java代理功能的非常好的概述。

希望这有帮助