Как динамически загрузить файл JAR с Vert.x JavaScript? - PullRequest
0 голосов
/ 28 февраля 2020

Используя Vert.x JavaScript (3.8.4), я хочу динамически загрузить файл JAR во время выполнения. Это необходимо, поскольку этот файл может не существовать при запуске моего приложения Vert.x. В идеале я хотел бы иметь возможность использовать такой код:

// load custom JAR file
requireJar("path/to/dynamic.jar");
// use class from dynamically loaded package
var instance = new com.mydynamicpackage.MyCustomClass();

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

На основе этого ответа я создал следующую функцию JavaScript для динамической загрузки класса из файла JAR:

var requireJavaClass=(function(){
    var method=java.net.URLClassLoader.class.getDeclaredMethod("addURL",java.net.URL.class);
    method.setAccessible(true);
    var cache={};
    var ClassLoader=java.lang.ClassLoader;
    var File=java.io.File;
    return function(classname,jarpath){
        var c=cache[classname];
        if (c) return c;
        if (jarpath) {
            var cl=ClassLoader.getSystemClassLoader();
            method.invoke(cl,new File(jarpath).toURI().toURL());
            cl.loadClass(classname);
        }
        return cache[classname]=Java.type(classname);
    }
})();

Эквивалент фрагмента, который я разместил в мой вопрос будет:

var MyCustomClass=requireJavaClass("com.mydynamicpackage.MyCustomClass","path/to/dynamic.jar");
var instance = new MyCustomClass();

До сих пор я проверял это только с Vert.x 3.8.5 , работающим в JRE8 , т.е. я могу ' Сказать, работает ли это также в более старых версиях Vert.x или с JRE9 +.

0 голосов
/ 28 февраля 2020

Вам может пригодиться этот ответ:

Как получить доступ к внешним файлам JAR из JavaScript с помощью Rhino и Eclipse?

Другой подход, который действителен было бы предоставить банке другие средства, т.е. не через реализацию javascript, чтобы потом проверить, есть ли она, а затем разобраться со случаем, если это не так.

    java.lang.Class.forName( 'com.mydynamicpackage.MyCustomClass' )

Это приведет к ошибке, если MyCustomClass не существует.

Загрузка файлов JAR во время выполнения не может быть хорошей идеей, если вы не можете определить, загружены ли они из ненадежного источника. По крайней мере, это верно для мира java.

...