2011-01-01 5 views
3

私はJavaアプリケーションのトラブルシューティングに役立つ簡単なJavaエージェントのキットを作っています。私が作成したいエージェントの1つは、JComponent.getToolTipText()メソッドをインストゥルメントして、マウスカーソルをその上に置くだけでGUIクラスをすばやく識別できるようにします。Instrumentedメソッドから自分のクラスを呼び出すときにJava NoClassDefFoundError

あなたは私の変圧器のコードと、ここでプロジェクトの残りの部分を見つけることができます:

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

私は次のように付属のエージェントと私のテスト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の両方にあります。だから私は迷う。

私が何かを見逃している人がいる場合は、それはあなたがより多くの情報を表示することがありますよう

乾杯、

トム

答えて

7

これはクラスローダの問題です。ブートストラップ・クラス・ローダーによって管理され、システム・クラス・ローダーによって管理されるクラス(org.leplus.sfn.tracer.ComponentTracer)を参照するクラス(javax.swing.JComponent)をインストルメントしています。

ComponentTracerクラスをブートストラップクラスローダーに配置すると、問題がなくなります。

java -Xbootclasspath/p:<path/to/jar/containing/ComponentTracer> -javaagent:... 
+0

私は今それを取得して動作します。ありがとう、トム。 –

+0

将来の読者のために、ブートストラップクラスローダーは、多くの唯一のリソースによって、初期クラスローダーとも呼ばれます。同様に、システムクラスローダは、アプリケーションクラスローダと呼ばれることもあります。 –

0

は-DDEBUGで実行してみてください。

また、ここにはターゲットディレクトリがあります。 http://sfn.cvs.sourceforge.net/viewvc/sfn/core/target/クラスフォルダはありますが、jarsフォルダはありませんか? jarパスがプロジェクトルートからの相対パスであることを確認してください。

関連する問題