有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在清单中指定我的Premainclass。mf在使用javaagent启动JVM时

我目前正在尝试Java插装,甚至在用-javaagent arg启动JVM并获得ClassNotFoundException时都遇到了问题

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

这是我遗嘱的内容。jar的舱单。mf:

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

测试剂。爪哇:

package testinstrumentation;

import java.lang.instrument.Instrumentation;

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

测试仪器。爪哇:

package testinstrumentation;

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

}

下面是我尝试运行它时的stacktrace:

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

我很确定错误在清单中我对Premain类的说明中。我的罐子。如有任何关于如何纠正此错误的建议,将不胜感激


共 (1) 个答案

  1. # 1 楼答案

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

    Premain-Class: testinstrumentation.TestAgent
    

    当然,测试仪器。TestAgent类文件应该位于同一个jar中。 从你的stacktrace中,我看到它在src中。testinstrumentation但是您的代码应该被放入testinstrumentation包中

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

    希望这有帮助