Пользователь URLClassLoader для загрузки файла jar "на лету" - PullRequest
0 голосов
/ 03 сентября 2018

Хорошо, в основном, я пытаюсь использовать метод, описанный здесь JarFileLoader , чтобы загрузить банку, содержащую класс, который будет использоваться так же, как если бы он был в пути к классам (имя класса будет динамическим, поэтому что мы можем просто добавить любой jar-файл с любым классом, и программа загрузит его посредством анализа текстового файла в основной строке).

Проблема в том, что когда я отлаживаю и проверяю объект URLClassLoader

protected Class<?> findClass(final String name)

Линия:

Resource res = ucp.getResource(path, false);

getResource () не находит имя класса в параметре.

Кто-то уже пытался загрузить файл JAR таким образом?

Спасибо.

Загрузчик:

public class JarFileLoader extends URLClassLoader {
    public JarFileLoader() {
        super(new URL[] {});
    }

    public JarFileLoader withFile(String jarFile) {
        return withFile(new File(jarFile));
    }

    public JarFileLoader withFile(File jarFile) {
        try {
            if (jarFile.exists())
                addURL(new URL("file://" + jarFile.getAbsolutePath() + "!/"));
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException(e);
        }
        return this;
    }

    public JarFileLoader withLibDir(String path) {
        Stream.of(new File(path).listFiles(f -> f.getName().endsWith(".jar"))).forEach(this::withFile);
        return this;
    }
}

Основной:

public static void main(String[] args) {
    new Initializer();
    JarFileLoader cl = new JarFileLoader();
    cl = cl.withFile(new File("libs/dpr-common.jar"));
    try {
        cl.loadClass("com.*****.atm.dpr.common.util.DPRConfigurationLoader");
        System.out.println("Success!");
    } catch (ClassNotFoundException e) {
        System.out.println("Failed.");
        e.printStackTrace();
    } finally {
        try {
            cl.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Здесь тестовый класс, который я использовал. Когда я отлаживаю URLClassLoader, я вижу в третьем цикле путь к файлу jar (цикл на пути к классам и URL, который вы добавляете здесь), но все еще не находит ресурс (и не может отлаживать класс URLClassPath, поэтому не знаете, что делает getRessource точно).

1 Ответ

0 голосов
/ 03 сентября 2018

Хорошо, я беру ответ на этот вопрос: Как динамически загрузить все банки из каталога?

И изменение части URL в начале так, как это делается, в длинной части это работает.

Так что пример может быть:

String path = "libs/dpr-common.jar";
if (new File(path).exists()) {
    URL myJarFile = new File(path).toURI().toURL();
    URL[] urls = { myJarFile };
    URLClassLoader child = new URLClassLoader(urls);
    Class DPRConfLoad = Class.forName("com.thales.atm.dpr.common.util.DPRConfigurationLoader", true, child);
    Method method = DPRConfLoad.getDeclaredMethod("getInstance");
    final Object dprConf = method.invoke(DPRConfLoad);
}

Все мое время было потрачено на поиски, в то время как это был пример, который был неправильным ... Все еще не понимает, почему они используют глупый URL, такой как "jar: file ..." и т. Д.

Спасибо всем.

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