私は、Javaアプリケーションのトラブルシューティングを支援するための単純なJavaエージェントのキットに取り組んでいます。インストルメントを作成したいエージェントの1つであるJComponent.getToolTipText()メソッドは、マウスカーソルをその上に置くだけでGUIクラスをすばやく識別します。
私のトランスフォーマーとプロジェクトの残りのコードはここにあります:
次のようにエージェントを接続してテスト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クラスが含まれています。
アプリケーションを起動してマウスをその上に置いたときに、アプリケーションが出力する内容は次のとおりです。
ローディングエージェント:JComponent 計装の準備ができました! スレッド「AWT-EventQueue-0」の例外java.lang.NoClassDefFoundError:org / leplus / sfn / tracer / ComponentTracer javax.swing.JComponent.getToolTipText(JComponent.java)で javax.swing.ToolTipManager $ insideTimerAction.actionPerformed(ToolTipManager.java:662)で ..。
私が驚いたのは、JREから任意のクラスを呼び出すようにトランスフォーマーを変更すると、それが機能することです。しかし、自分のクラスorg.leplus.sfn.tracer.ComponentTracerを呼び出すと機能しません。私の最初の推測はクラスパスの問題でしたが、ComponentTracerはクラスパスとエージェントのjarの両方にあります。だから私は迷子になります。
誰かが私が何かを逃しているところを見たら。
乾杯、
トム