tharo
Mitglied
Hallo erst einmal.
Ich habe dann also nach langem hin und her mich auch mal daran gewagt einen eigenen Class Loader zu entwerfen. Das war einfach höchste Eisenbahn bei dem Umfang meines Projektes.
Der erste Test mit einem Code wie diesem z.B.
lief auch absolut problemlos.
Nun wollte ich allerdings mehr als nur ein Plugin pro JAR Archiv haben. Wenn schon denn schon. Also hatte ich den Gedanken mir ein kleines config File (das hier mal nicht Bestand des Problems sein soll) mit in das .JAR archiv zu speichern das mir den classpath der einzelnen Plugins übermittelt. Ab dort sollte alles so funktionieren wie bei oben geposteten Beispiel das man z.B. so aufrufen kann
Ich dachte das sollte schon kein Problem darstellen. Ich habe früher ja auch schon immer eifrig Bilder und andere Ressourcen aus JAR Archiven geladen. Wenn auch immer aus dem selben wie jenes in dem auch mein Programm lag.
Nun ... in diesem Fall will ich ja keine ressource aus dem System Path (oder dem Programm Path) sondern flexibel einfach nur etwas aus dem eingeladenen JAR archiv. Ich benutze also getResource() und nicht getSystemResource().
Da geht das Probem los. Die einzige Ressource in meinem neuen classloader scheint das jar archiv selbst zu sein ..
Was mache ich Falsch?
Ich habe dann also nach langem hin und her mich auch mal daran gewagt einen eigenen Class Loader zu entwerfen. Das war einfach höchste Eisenbahn bei dem Umfang meines Projektes.
Der erste Test mit einem Code wie diesem z.B.
Code:
private static Plugin loadPlugin(URL[] locations, String name)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
URLClassLoader classloader = new URLClassLoader(locations, ClassLoader.getSystemClassLoader());
Class<?> cls = classloader.loadClass(name);
if (!Plugin.class.isAssignableFrom(cls)) {
throw new RuntimeException("Invalid class");
}
return (Plugin)cls.newInstance();
}
Nun wollte ich allerdings mehr als nur ein Plugin pro JAR Archiv haben. Wenn schon denn schon. Also hatte ich den Gedanken mir ein kleines config File (das hier mal nicht Bestand des Problems sein soll) mit in das .JAR archiv zu speichern das mir den classpath der einzelnen Plugins übermittelt. Ab dort sollte alles so funktionieren wie bei oben geposteten Beispiel das man z.B. so aufrufen kann
Code:
File pluginFile = new File("../plugins/test.jar");
URL[] locations = new URL[] {pluginFile.toURL()};
Plugin plugin = loadPlugin(locations, "de.taliis.test.plugin.TestPlugin");
Ich dachte das sollte schon kein Problem darstellen. Ich habe früher ja auch schon immer eifrig Bilder und andere Ressourcen aus JAR Archiven geladen. Wenn auch immer aus dem selben wie jenes in dem auch mein Programm lag.
Code:
URL url = ClassLoader.getSystemResource(path);
Nun ... in diesem Fall will ich ja keine ressource aus dem System Path (oder dem Programm Path) sondern flexibel einfach nur etwas aus dem eingeladenen JAR archiv. Ich benutze also getResource() und nicht getSystemResource().
Da geht das Probem los. Die einzige Ressource in meinem neuen classloader scheint das jar archiv selbst zu sein ..
Was mache ich Falsch?
Code:
File archive = new File("../plugins/test.jar");
try {
classLoader = new URLClassLoader(
new URL[] {archive.toURL()},
ClassLoader.getSystemClassLoader()
);
} catch (MalformedURLException e) {
e.printStackTrace();
return;
}
if(classLoader==null) return;
// catch the config file
URL configURL = classLoader. findResource("./plugins.txt");
URL alles[] = classLoader.getURLs();
System.out.println(alles[0].getFile() + alles.lenght);