2011-01-01 3 views
3

Java 응용 프로그램의 문제를 해결하는 데 도움이되는 간단한 Java 에이전트 키트를 준비 중입니다. 내가 만들고자하는 에이전트 중 하나는 JComponent.getToolTipText() 메서드를 사용하여 GUI 클래스 위에 마우스 커서를 올려 놓음으로써 GUI 클래스를 신속하게 식별 할 수 있습니다.Instrumented 메서드에서 자신의 클래스를 호출 할 때 Java NoClassDefFoundError

당신은 내 변압기의 코드와 여기에 프로젝트의 나머지 부분을 찾을 수 있습니다

 
$ 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- :

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

나는 다음과 같이 부착 된 에이전트와 내 테스트 GUI를 실행 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를 호출하면 작동하지 않습니다. 내 첫 번째 추측은 classpath 문제 였지만 ComponentTracer는 classpath와 에이전트의 jar 모두에있다. 그래서 나는 길을 잃었다.

내가 누락 된 부분이 있으면 알려주세요. 그것은 당신에게 더 많은 정보를 표시 할 수 있습니다로

건배,

답변

7

이것은 클래스 로더 문제입니다. 부트 스트랩 클래스 로더에 의해 관리되는 클래스 (javax.swing.JComponent)를 계측하고 시스템 클래스 로더에 의해 관리되는 클래스 (org.leplus.sfn.tracer.ComponentTracer)를 참조하게합니다.

ComponentTracer 클래스를 부트 스트랩 클래스 로더에 넣으면 문제가 사라집니다.

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

좋아, 이제 알았어. 고마워, 톰. –

+0

미래의 독자를 위해, 부트 스트랩 클래스 로더는 많은 유일한 자원에 의해 원시 클래스 로더라고도 불린다. 마찬가지로 시스템 클래스 로더는 응용 프로그램 클래스 로더라고도합니다. –

관련 문제