2016-06-29 4 views
0

Ich habe einen ServiceLoader, der versucht, alles zu laden, das Plugin erweitert. Es findet nichts, obwohl ich die Service-Datei eingerichtet habe.ServiceLoader nicht finden Plugin

Quellcode (com.otabi.firestar.pajamatale.plugin.loader.PluginFinder ist die Klasse): https://github.com/firestar115/PajamaTale

Das Plugin: https://github.com/firestar115/PajamaTest

Was mache ich falsch hier? Warum erscheint das Plugin nicht und druckt "Test Kappa"?

+0

Was ist die Frage? –

+0

Wie kann ich JARs, die nicht in meinem Klassenpfad sind, im ServiceLoader anzeigen lassen? @NicolasFilotto – TsundereBug

Antwort

1

Sie müssen eine Instanz von URLClassLoader zu schaffen, bieten Sie die URL der Verzeichnisse, die Plugins mit dem Kontext ClassLoader als Mutterclassloader enthalten (ich meine Thread.currentThread().getContextClassLoader()) und verwenden ServiceLoader.load(Plugin.class, myURLClassLoader) statt ServiceLoader.load(Plugin.class), die intern den Kontext ClassLoader verwendet, die ist in Ihrem Fall nicht genug, da sich Ihre Plugins nicht in Ihrem Klassenpfad befinden.

Etwas wie:

ClassLoader myURLClassLoader = new URLClassLoader(
    new URL[]{new File("plugins").toURI().toURL()}, 
    Thread.currentThread().getContextClassLoader() 
); 
ServiceLoader<Plugin> loader = ServiceLoader.load(Plugin.class, myURLClassLoader); 
+0

Also im Grunde 'ServiceLoader.load (neue URLClassLoader (" plugins/"))'? – TsundereBug

+0

ja das ist die Idee mit dem Kontext Classloader als Eltern Classloader –

+0

Um die URL zu erstellen benutze ich ein 'file: //' Protokoll oder benutze einfach das normale 'plugin'? – TsundereBug

1

kann ich bestätigen, dass die URLClassLoader ein URL für jeden jar erfordert, dass ein Plugin darstellt. Es ist nicht genug, um den Klassenlader mit dem URL zu dem Verzeichnis zu instanziieren, das die jar-Dateien enthält. Also, was Sie tun müssen:

File[] pluginFiles = directory.listFiles((File dir, String name) -> name.endsWith(".jar")); 
    List<URL> urlsList = new ArrayList<>(); 
    for (File file : pluginFiles) { 
     try { 
      urlsList.add(file.toURI().toURL()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 
    URLClassLoader classLoader = URLClassLoader.newInstance(urlsList.toArray(new URL[]{}), Thread.currentThread().getContextClassLoader()); 

Dann wird die ServiceLoader Lage sein, Ihre Plugins zu finden.

Verwandte Themen