Java NoClassDefFoundError при вызове собственного класса из инструментированного метода - PullRequest
3 голосов
/ 02 января 2011

Я работаю над набором простых агентов Java, чтобы помочь мне (и, надеюсь, другим) устранить неполадки в приложениях Java.Один из агентов, которого я хотел бы создать, - инструмент JComponent.getToolTipText (), чтобы быстро идентифицировать любой класс графического интерфейса, просто наведя на него курсор мыши.проект здесь:

http://sfn.cvs.sourceforge.net/viewvc/sfn/core/src/main/java/org/leplus/sfn/transformer/JComponentTransformer.java?view=markup

Я запускаю свой тестовый графический интерфейс с подключенным агентом следующим образом:

$ java -javaagent:target/jars/sfn-0.1-agent.jar=JComponent -cp lib/jars/bcel-5.2.jar:target/jars/sfn-0.1-test.jar:target/jars/sfn-0.1-agent.jar org.leplus.sfn.test.Main

sfn-0.1-agent.jar содержит org.leplus.sfn.transformer.JComponentTransformer class.sfn-0.1-test.jar содержит класс org.leplus.sfn.test.Main.

Вот что печатает приложение, когда я запускаю его и налагаю на него мышь:

Loading agent: JComponent
Instrumentation ready!
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/leplus/sfn/tracer/ComponentTracer
 at javax.swing.JComponent.getToolTipText(JComponent.java)
 at javax.swing.ToolTipManager$insideTimerAction.actionPerformed(ToolTipManager.java:662)
...

Что меня удивляет, так это то, что если я изменю свой преобразователь на вызов любого класса из JRE, это сработает.Но это не работает, когда я вызываю свой собственный класс org.leplus.sfn.tracer.ComponentTracer.Моим первым предположением была проблема пути к классам, но ComponentTracer находится и в пути к классам, и в банке агента.Так что я потерян.

Если кто-нибудь из вас увидит, где я что-то упускаю.

Приветствия,

Том

Ответы [ 2 ]

7 голосов
/ 02 января 2011

Это проблема загрузчика классов. Вы управляете классом (javax.swing.JComponent), управляемым загрузчиком классов начальной загрузки, и заставляете его ссылаться на класс (org.leplus.sfn.tracer.ComponentTracer), управляемый загрузчиком системных классов.

Если поместить класс ComponentTracer в загрузчик классов начальной загрузки, проблема должна исчезнуть.

java -Xbootclasspath/p:<path/to/jar/containing/ComponentTracer> -javaagent:...
0 голосов
/ 02 января 2011

Попробуйте запустить с -DDEBUG, так как он может показать вам больше информации.

Кроме того, я вижу целевой каталог здесь. http://sfn.cvs.sourceforge.net/viewvc/sfn/core/target/ Содержит папку классов, но нет папки jars? Убедитесь, что пути к банкам относятся к корню проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...