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:
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
Ok ich bekomme es jetzt und es funktioniert. Vielen Dank, Tom. –
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. –