Hallo,
ich möchte in meinem Programm Plugins laden die alle von dem Interface ComputesDistance abstammen.
Diese Plugins liegen in dem Verzeichnis 'plugins' des Programms.
Es wird leider eine ClassNotFoundException geworfen, wenn ich Class.forName(directory+Pluginname) das Verzeichnis und den Klassenname übergebe.
Muss ich dem ClassLoader möglicherweise sagen, dass er auch in dem Plugins Verzeichnis nach den Klassen suchen soll ? Wenn ja, wie gebe ich das in dem Programmcode an ?
Ich habe das gleiche Problem auf folgende Art versucht zu lösen:
URL url = new File(new File(".").getCanonicalPath()+"/plugins/").toURI().toURL();
URLClassLoader cl = new URLClassLoader(new URL[]{url});
Class<?> c = cl.loadClass(KlassenName);
ComputesDistance o2 = (ComputesDistance)c.newInstance();
Obwohl die geladene Klasse c das Interface ComputesDistance implementiert, wird eine ClassCastException in der letzten Zeile geworfen.
Am liebsten würde ich das Problem mit der oberen Methode (Class.forName()) lösen, weil es einfach weniger Code ist...
Vielen Dank für Antworten, Alexander
ich möchte in meinem Programm Plugins laden die alle von dem Interface ComputesDistance abstammen.
Diese Plugins liegen in dem Verzeichnis 'plugins' des Programms.
Es wird leider eine ClassNotFoundException geworfen, wenn ich Class.forName(directory+Pluginname) das Verzeichnis und den Klassenname übergebe.
Muss ich dem ClassLoader möglicherweise sagen, dass er auch in dem Plugins Verzeichnis nach den Klassen suchen soll ? Wenn ja, wie gebe ich das in dem Programmcode an ?
Ich habe das gleiche Problem auf folgende Art versucht zu lösen:
URL url = new File(new File(".").getCanonicalPath()+"/plugins/").toURI().toURL();
URLClassLoader cl = new URLClassLoader(new URL[]{url});
Class<?> c = cl.loadClass(KlassenName);
ComputesDistance o2 = (ComputesDistance)c.newInstance();
Obwohl die geladene Klasse c das Interface ComputesDistance implementiert, wird eine ClassCastException in der letzten Zeile geworfen.
Am liebsten würde ich das Problem mit der oberen Methode (Class.forName()) lösen, weil es einfach weniger Code ist...
Vielen Dank für Antworten, Alexander