Как динамически загрузить файл JAR с помощью Vert.x JavaScript?

Используя 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();

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


person xpages-noob    schedule 28.02.2020    source источник
comment
почитайте что-нибудь про OSGI   -  person injecteer    schedule 28.02.2020


Ответы (2)


Возможно, вам будет полезен этот ответ:

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

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

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

Это вызовет ошибку, если MyCustomClass не существует.

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

person Erunafailaro    schedule 28.02.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+.

person xpages-noob    schedule 28.02.2020