Я работаю над набором простых агентов Java, которые помогут мне (и, надеюсь, другим) устранять неполадки в приложениях Java. Один из агентов, который я хотел бы создать, представляет собой метод JComponent.getToolTipText(), позволяющий быстро идентифицировать любой класс GUI, просто наведя на него курсор мыши.
Вы можете найти код моего трансформатора и остальную часть проекта здесь:
Я запускаю свой тестовый графический интерфейс с подключенным агентом следующим образом:
$ 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. 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 находится как в пути к классам, так и в банке агента. Так что я потерян.
Если кто-то из вас видит, где я что-то упускаю.
Ваше здоровье,
Том