Je l'extrait suivant du code java:classloading dynamique échoue sur l'exécution
final Class<?> junitCoreClass = AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
@Override
public URLClassLoader run() {
return new URLClassLoader(new URL[] { junitJarUrl });
}
}).loadClass("org.junit.runner.JUnitCore");
System.out.println(junitCoreClass.getName());
final JUnitCore junitCore = (JUnitCore) junitCoreClass.newInstance();
Cette compile très bien. Mais quand j'essaie de l'exécuter, quelque chose d'étrange arrive; un java.lang.NoClassDefFoundError
est lancé sur cette dernière ligne, en référence à la classe qui vient d'être chargée. La partie étrange est, le println
imprime le nom de classe exact.
J'ai vérifié que si je garde la nouvelle référence d'instance Object
et la manipule uniquement par réflexion, tout va bien, donc le morceau de code incriminé doit être la distribution explicite. Est-ce que quelqu'un peut m'expliquer pourquoi cela arrive, et aussi me dire comment je peux réaliser ce que j'essaie de faire?
PS: Pour ceux qui veulent voir une trace de la pile de plus près, il n'y a pas grand chose à montrer:
java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore at [last line of example) [lines from my app] Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:315) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) at java.lang.ClassLoader.loadClass(ClassLoader.java:250) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398) at [last line of example] [lines from my app]
Veuillez nous montrer la pile complète pour l'exception. –