2015-11-16 3 views
1

В настоящее время я пытаюсь экспериментировать с инструментами Java Instrumentation, и у меня возникают проблемы даже с запуском JVM с помощью -javaagent arg и получением ClassNotFoundException.Как я должен указать свой Premain-класс в manifest.mf при запуске JVM с помощью -javaagent

У меня есть простой тестовый проект под названием TestInstrumentation. Он имеет папку src с пакетом под названием testinstrumentation. Внутри: TestInstrumentation.java и TestAgent.jar.

Вот содержание manifest.mf моей TestAgent.jar в:

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"); 
    } 

} 

Здесь вы 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 в манифесте.mf моей банки. Любые предложения относительно того, как я мог бы исправить это, были бы оценены!

+0

Не вдаваясь в подробность: Ваше сообщение об ошибке упоминается класс 'src.testinstrumentation.TestAgent' (обратите внимание на дополнительных _src_), в то время как вы показали нам класс' testinstrumentation.TestAgent'. – Seelenvirtuose

+0

Отредактировано. Играл с линией в манифесте и забыл изменить его. Все равно получите ту же ошибку, только с «TestAgent», поскольку класс не найден –

ответ

3

Это больше похоже на проблему с упаковкой. В целом вы делаете все правильно: вы должны указать следующее в своем манифесте.

Premain-Class: testinstrumentation.TestAgent 

Конечно, файл класса testinstrumentation.TestAgent должен находиться в том же банке. Из вашего StackTrace я вижу, что он смотрит в src.testinstrumentation однако ваш код должен быть введен в testinstrumentation пакет

Я рекомендую вам прочитать серию Not so secret java agents учебников (4 части) , Это дает неплохой обзор возможностей java-агентов.

Надеется, что это помогает

+0

Получил это, чтобы это сделать, спасибо! И да, я на первой части этой серии обучающих программ довольно интересен. –