Ich erhalte NoClassFoundError, wenn vom Runtime Classloader geladene Klassen nicht auf bereits vom Java Rootloader geladene Klassen zugreifen können. Da sich die verschiedenen Klassenlader in unterschiedlichen Sicherheitsdomänen befinden (laut Java), lässt der JVM nicht zu, dass Klassen, die bereits vom Rootloader geladen wurden, im Adressraum des Runtime-Laders aufgelöst werden.
Starten Sie Ihr Programm mit 'java -javaagent:tracer.jar [IHR java ARGS]'.
Es erzeugt eine Ausgabe, die die geladene Klasse und die Loader-Env, die die Klasse geladen hat, anzeigt. Das ist sehr hilfreich, um herauszufinden, warum eine Klasse nicht aufgelöst werden kann.
// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5
import java.lang.instrument.*;
import java.security.*;
// manifest.mf
// Premain-Class: ClassLoadTracer
// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class
// java -javaagent:tracer.jar [...]
public class ClassLoadTracer
{
public static void premain(String agentArgs, Instrumentation inst)
{
final java.io.PrintStream out = System.out;
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);
// dump stack trace of the thread loading class
Thread.dumpStack();
// we just want the original .class bytes to be loaded!
// we are not instrumenting it...
return null;
}
});
}
}
1 Stimmen
Ich glaube, es kann auch passieren, wenn Sie Ihr Java-Programm nicht mit der richtigen Syntax ausführen. Zum Beispiel müssen Sie Ihre Klasse aus dem Root-Bin-Ordner mit dem vollständigen Paketnamen aufrufen (z. B. my.package.myClass). Ich würde genauer sein, wenn ich könnte, aber ich bin kein großer Java-Kenner. Ich kann mich nur daran erinnern, dass ich das ein paar Mal vermasselt habe.