3

私は、Javaアプリケーションのトラブルシューティングを支援するための単純なJavaエージェントのキットに取り組んでいます。インストルメントを作成したいエージェントの1つであるJComponent.getToolTipText()メソッドは、マウスカーソルをその上に置くだけでGUIクラスをすばやく識別します。

私のトランスフォーマーとプロジェクトの残りのコードはここにあります:

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クラスが含まれています。

アプリケーションを起動してマウスをその上に置いたときに、アプリケーションが出力する内容は次のとおりです。

ローディングエージェント: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の両方にあります。だから私は迷子になります。

誰かが私が何かを逃しているところを見たら。

乾杯、

トム

4

2 に答える 2

8

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

ComponentTracerクラスをブートストラップクラスローダーに配置すると、問題は解消されます。

java -Xbootclasspath/p:<path/to/jar/containing/ComponentTracer> -javaagent:...
于 2011-01-02T03:59:08.557 に答える
0

より多くの情報が表示される可能性があるため、-DDEBUGを使用して実行してみてください。

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

于 2011-01-02T01:48:37.620 に答える