Java программист здесь.
Я пытаюсь создать "систему плагинов" в java, и я бы не хотел, чтобы пользователь мог импортировать свои собственные библиотеки java если им нужно, чтобы они не ограничивались только тем, чтобы мое приложение для загрузки плагинов находилось в их пути сборки.
Я планировал разрешить пользователю создать папку с именем "lib" в своем проекте, где они поместит все остальные библиотеки, которые им нужны, чтобы затем они могли добавить их в путь сборки с ошибкой приложения при загрузке всех необходимых плагинов. Но у меня проблемы с этим.
Вот пример файла jar плагина, который структурирован так, как я хочу, чтобы он был:
Plugin.jar
|---org
|---pluginpackage
|---PluginMainClass.class
|---lib
|---user-lib.jar
|---libpackage
|---InterfaceA.class
|---ClassB.class
|---...
|---plugin-description.xml
Что мне было интересно, так это: что было бы наиболее эффективным способом загрузить все библиотеки, загруженные пользователем в папку «lib»?
Это текущий код, который у меня есть, но загрузка библиотек занимает больше времени, чем нужно:
private void readLibraryInJar(JarInputStream jarLibraryInputStream, File dirOut) throws IOException {
if (jarLibraryInputStream == null)
return;
JarEntry entry = null;
while ((entry = jarLibraryInputStream.getNextJarEntry()) != null) {
final String jarPath = entry.getName().trim();
if (jarPath.endsWith(".class")) {
File f = new File(dirOut, jarPath);
if (!f.exists()) {
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
}
f.createNewFile();
}
byte[] buffer = new byte[1024 * 100];
FileOutputStream out = new FileOutputStream(f);
int len;
while ((len = jarLibraryInputStream.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.close();
}
}
}
Приведенный выше код читает каждый файл класса внутри нужной библиотеки и копирует его содержимое в новый файл. Я знаю, что где-то есть более эффективный способ (например, Apache У проекта Tomcat может быть папка «lib»), поэтому мне было интересно, смогу ли я загрузить библиотечный файл JAR более эффективно, чем сейчас (планируя использовать URLClassLoader чтобы загрузить его, так что если бы вы могли преобразовать его в URL, который был бы замечательным, но если это невозможно, я все еще в порядке с любым более эффективным способом, чем мой текущий.)
Заранее спасибо!