Не удается заставить -javaagent работать без ошибок

Я пытаюсь создать простую программу агента Java, прежде чем реализовать настоящую вещь. Я не могу заставить его работать. Очевидно, у меня есть какая-то проблема с конфигурацией или путем к классу. Никакие поиски и попытки не привели меня к этой проблеме.

Если я побегу:

java -cp ./demoAgent.jar -javaagent:./demoAgent.jar com.kingtigerbooks.demoMod.Main

Я получаю следующую ошибку:

Exception in thread "main" java.lang.ClassNotFoundException: com.kingtigerbooks.demoAgent.Agent
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:280)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338)
FATAL ERROR in native method: processing of -javaagent failed
Abort trap

Я запускаю это на своем Mac. Файл jar с агентом находится в текущем каталоге. Манифест для jar-файла выглядит так:

Manifest-Version: 1.0
Premain-class: com.kingtigerbooks.demoAgent.Agent
Can-Redefine-Classes: true

Если пахнет проблемой пути к классу, но, как вы видите, я включил банку в путь к классу. Любая помощь будет оценена по достоинству. Это очень простой проект.


person DungeonTiger    schedule 26.03.2012    source источник
comment
Тут явно что-то неладное. Я сделал примерно то же самое в Ubuntu, и это сработало. Я не вижу, чем отличается. В идеале я хотел бы получить подсказки о том, как отлаживать этот тип проблемы.   -  person DungeonTiger    schedule 27.03.2012
comment
Я получил эту ошибку при компиляции моего проекта с jdk1.8, когда я должен был использовать 1.7....   -  person djangofan    schedule 30.01.2015


Ответы (2)


Проблема решена. У меня был плохой файл jar. Файл JAR агента не содержал класса агента. Создав правильный файл jar и указав полный путь к jar в параметре javaagent, все это работает.

person DungeonTiger    schedule 27.03.2012

при запуске агента вы не добавляете jar-файл агента в обычный путь к классам.

в качестве примечания вы можете добавить -verbose:class в командную строку, чтобы получить информацию о процессе загрузки класса.

person jtahlborn    schedule 26.03.2012
comment
К сожалению, это привело к той же ошибке. Командная строка была java -javaagent:./demoAgent.jar com.kingtigerbooks.demoMod.Main - person DungeonTiger; 26.03.2012
comment
@DungeonTiger - у вас есть основной класс где-нибудь в вашем пути к классам? - person jtahlborn; 27.03.2012
comment
Хммм... Я бы сказал да, так как если я удалю параметр -javaagent, он запустится, и я получу свой прекрасный вывод типа Hello World. Да. Это говорит мне, что эта часть верна. Кроме того, он не жалуется на класс Main, а жалуется на класс Agent, который находится в банке, demoAgent.jar. - person DungeonTiger; 27.03.2012
comment
@DungeonTiger - у вас установлен CLASSPATH? также, какова структура каталогов в каталоге, в котором вы запускаете команду? - person jtahlborn; 27.03.2012
comment
Ты собираешься стрелять в меня. Нашел проблему. Я поместил неправильный файл класса в банку. Дох. Я узнал от вас, что мне не нужно помещать jar в путь к классу, если он указан как часть опции javaagent. Спасибо за вашу помощь. Теперь перейдем к более интересным вещам, которые используют BCEL для модификации кода по мере его загрузки. Да! - person DungeonTiger; 27.03.2012