Hallo @ all,
ich schlage mich im Moment mit einem ClassLoader rum. Mein Ziel ist es, aus ein Paar jar Dateien mittels Reflection und Anntotation Informationen aus einer bestimmten Klasse auszulesen. Der Code an sich funktioniert ohne Probleme in meinem Projekt (Projekt A). Jedoch verwendet mein Projekt ein eclipse.plugin Projekt (Projekt B) und dann knallt es.
Erst mal ein Paar Code-Schnipsel aus dem Projekt A
Klasse A1
Aus Klasse B1
Wenn der Code aus meinem Projekt ausgeführt wird, so ist der ClassLoader cl ein "sun.misc.Launcher$AppClassLoader"
Dieser erbt von URLClassLoader und man kann daher die Methode addURL verwenden.
Wenn jedoch Projekt B den Code in Projekt A verwendet, so handelt es sich um folgenden ClassLoader
"org.eclipse.core.runtime.internal.adaptor.ContextFinder". Die Folge ist, dass es in Zeile m.invoke(cl, new Object[] { jarFile.toURL() }); knallt.
Daher habe ich versucht den ParentLoader von "org.eclipse.core.runtime.internal.adaptor.ContextFinder" zu verwenden (cl=cl.getParent()). Dies ist der "sun.misc.Launcher$AppClassLoader".
Danach läuft der Code in Klasse A1 durch, jedoch kann der Code in Klasse B1 (Class.forName) die Klasse nicht finden (java.lang.ClassNotFoundException).
Ich stehe auf dem Schlauch und habe keinen Ansatz, wie ich dies lösen könnte.
ich schlage mich im Moment mit einem ClassLoader rum. Mein Ziel ist es, aus ein Paar jar Dateien mittels Reflection und Anntotation Informationen aus einer bestimmten Klasse auszulesen. Der Code an sich funktioniert ohne Probleme in meinem Projekt (Projekt A). Jedoch verwendet mein Projekt ein eclipse.plugin Projekt (Projekt B) und dann knallt es.
Erst mal ein Paar Code-Schnipsel aus dem Projekt A
Klasse A1
Code:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Method m = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
m.setAccessible(true);
for (String title : jarsToBeLoaded.keySet()) {
File jarFile = new File(jarsToBeLoaded.get(title));
m.invoke(cl, new Object[] { jarFile.toURL() });
...
}
...
Aus Klasse B1
Code:
Class instandeDataClass = Class.forName(pluginDS.getInstanceDataClass());
Wenn der Code aus meinem Projekt ausgeführt wird, so ist der ClassLoader cl ein "sun.misc.Launcher$AppClassLoader"
Dieser erbt von URLClassLoader und man kann daher die Methode addURL verwenden.
Wenn jedoch Projekt B den Code in Projekt A verwendet, so handelt es sich um folgenden ClassLoader
"org.eclipse.core.runtime.internal.adaptor.ContextFinder". Die Folge ist, dass es in Zeile m.invoke(cl, new Object[] { jarFile.toURL() }); knallt.
Daher habe ich versucht den ParentLoader von "org.eclipse.core.runtime.internal.adaptor.ContextFinder" zu verwenden (cl=cl.getParent()). Dies ist der "sun.misc.Launcher$AppClassLoader".
Danach läuft der Code in Klasse A1 durch, jedoch kann der Code in Klasse B1 (Class.forName) die Klasse nicht finden (java.lang.ClassNotFoundException).
Ich stehe auf dem Schlauch und habe keinen Ansatz, wie ich dies lösen könnte.