ЭФФЕКТИВНО Загрузить классы из jar-файла ВНУТРИ jar-файла - PullRequest
0 голосов
/ 09 апреля 2020

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, который был бы замечательным, но если это невозможно, я все еще в порядке с любым более эффективным способом, чем мой текущий.)

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...