Я хочу создать «модули», которые расширяют интерфейс «модуля», это будут отдельные jar-файлы, которые загружаются во время выполнения - по сути, добавляя дополнительные функции. Я хочу, чтобы они были загружены как объект 'Module' (из интерфейса).
Я пробовал приведенный ниже код, и хотя мой код печатает Found module
, он ничего не делает послечто.
try {
Collection<URL> urlList = new ArrayList<>();
Path pluginsDir = Paths.get(Common.getPlugin().getDataFolder().getPath(), "modules");
try (DirectoryStream<Path> jars = Files.newDirectoryStream(pluginsDir, "*.jar")) {
for (Path jar : jars) {
System.out.println("Found module (" + jar.toFile().getName() + ").");
urlList.add(jar.toUri().toURL());
}
}
URL[] urls = urlList.toArray(new URL[0]);
ClassLoader pluginClassLoader = new URLClassLoader(urls, this.getClass().getClassLoader());
ServiceLoader<Module> loader = ServiceLoader.load(Module.class, pluginClassLoader);
for (Module module : loader) {
System.out.println("module.getName() = " + module.getName());
}
} catch (IOException ex) {
ex.printStackTrace();
}
Я бы ожидал, что оно напечатает имя модуля (как метод интерфейса), но оно не зацикливается.
Например, модуль будет делать;
public class ExampleModule implements Module {
@Override
public String getName() {
return "Example";
}
@Override
public void load() {
Bukkit.getLogger().info("Hello!");
}
}
Спасибо.