私はJavaアプリケーションのトラブルシューティングに役立つ簡単なJavaエージェントのキットを作っています。私が作成したいエージェントの1つは、JComponent.getToolTipText()メソッドをインストゥルメントして、マウスカーソルをその上に置くだけでGUIクラスをすばやく識別できるようにします。Instrumentedメソッドから自分のクラスを呼び出すときにJava NoClassDefFoundError
あなたは私の変圧器のコードと、ここでプロジェクトの残りの部分を見つけることができます:
私は次のように付属のエージェントと私のテスト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はクラスパスとエージェントのjarの両方にあります。だから私は迷う。
私が何かを見逃している人がいる場合は、それはあなたがより多くの情報を表示することがありますよう
乾杯、
トム
私は今それを取得して動作します。ありがとう、トム。 –
将来の読者のために、ブートストラップクラスローダーは、多くの唯一のリソースによって、初期クラスローダーとも呼ばれます。同様に、システムクラスローダは、アプリケーションクラスローダと呼ばれることもあります。 –