2011-01-01 13 views
3

Ich arbeite an einem Paket einfacher Java-Agenten, die mir (und hoffentlich auch anderen) bei der Fehlerbehebung von Java-Anwendungen helfen. Einer der Agenten, die ich erstellen möchte, ist die JComponent.getToolTipText() -Methode, mit der Sie schnell alle GUI-Klassen identifizieren können, indem Sie den Mauszeiger darüber bewegen.Java NoClassDefFoundError beim Aufruf der eigenen Klasse aus der instrumentierten Methode

Sie können den Code meines Transformator und den Rest des Projekts finden Sie hier:

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

ich meine Test GUI starten mit dem Agenten wie folgt angehängt:

 
$ 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 enthält die Klasse org.leplus.sfn.transformer.JComponentTransformer. sfn-0.1-test.jar enthält die Klasse org.leplus.sfn.test.Main. Hier

ist, was die Anwendung druckt, wenn ich es starten und ich habe die Maus darüber:

 
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) 
... 

Was ich ist überraschend ist, dass, wenn ich meinen Transformator ändere jede Klasse von der JRE zu nennen, es funktioniert. Aber es funktioniert nicht, wenn ich meine eigene Klasse org.leplus.sfn.tracer.ComponentTracer anrufe. Meine erste Schätzung war ein Klassenpfadproblem, aber der ComponentTracer befindet sich sowohl im Klassenpfad als auch im Jar des Agenten. Also bin ich verloren.

Wenn einer von euch sieht, wo ich etwas verpasse.

Cheers,

Tom

Antwort

7

Es ist ein Klassenlader Problem. Sie instrumentieren eine Klasse (javax.swing.JComponent), die vom Bootstrap-Klassenlader verwaltet wird, und verweisen auf eine Klasse (org.leplus.sfn.tracer.ComponentTracer), die vom Systemklassenlader verwaltet wird.

Wenn Sie Ihre ComponentTracer-Klasse im Bootstrap-Klassenlader platzieren, sollte das Problem verschwinden.

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

Ok ich bekomme es jetzt und es funktioniert. Vielen Dank, Tom. –

+0

Für zukünftige Leser wird der Bootstrap-Klassenlader von vielen nur Ressourcen auch als primärer Klassenlader bezeichnet. In ähnlicher Weise wird der Systemklassenlader manchmal als der Anwendungsklassenlader bezeichnet. –

0

Versuchen mit -DDEBUG läuft, wie es Ihnen mehr Informationen zeigen könnten.

Auch ich sehe das Zielverzeichnis hier. http://sfn.cvs.sourceforge.net/viewvc/sfn/core/target/ Es enthält einen Ordner Klassen, aber keinen Ordner jars? Stellen Sie sicher, dass die Jar-Pfade relativ zum Projektstamm sind.