2017-02-03 2 views
7

В основном у меня есть Java, которая запускает несколько сценариев «plugin», используя Javascript через Rhino или Nashorn, в зависимости от того, какой пользователь JRE установил пользователь.Добавить и удалить Jar-файлы и классы изнутри JavaScript (Rhino/Nashorn)

У меня также есть система в среде Java, которая позволяет подключать дополнительные файлы .JAR во время выполнения.

Это все прекрасно и денди. Однако я столкнулся с ситуацией, когда мне нужно что-то немного другое: я хочу загрузить файл .JAR в ClassPath из в экземпляр двигателя Rhino/Nashorn, поэтому классы доступны этому экземпляру (и только этот экземпляр), а затем удалите их, когда двигатель закончит работу.

Я знаю, что я могу легко вызвать существующую Java-процедуру для загрузки URL-адреса файла .JAR с помощью JavaScript, однако классы затем постоянно установлены, и я не могу избавиться от них.

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

Мой существующий URL погрузчик:

public static void addURL(URL u) { 
    final Class[] parameters = new Class[]{URL.class}; 
    URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    Class sysclass = URLClassLoader.class; 

    try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader, new Object[]{u}); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Теперь я на самом деле не много подсказки, как это работает - я не сила Java программист (я C/C++ в основном). Я знаю, что вы не можете «выгружать» URL-адрес из URLClassLoader, поэтому я не спрашиваю об этом. Наверное, было бы лучше, если бы я мог добавить файл .JAR в «временный» URLClassLoader, после чего я тонул в конце выполнения. Или каким-то образом я могу просто загрузить классы непосредственно в движок сценария, а не в основной Java ClassPath.

Если это то, что я мог бы просто вызвать из JavaScript прямо, это было бы здорово, но я не против реализации некоторых методов Java для выполнения задания, если это необходимо, или даже в некоторой степени расширять механизм сценариев.

ответ

5

Чтобы изолировать определенные классы плагинов, вам может потребоваться создать отдельный (пользовательский) экземпляр загрузчика класса и передать его в механизм java-скрипта. Любой класс, загруженный конкретным загрузчиком классов, будет отображаться только для конкретного механизма сценария java.

Я нашел this answer, которые описывают загрузчик классов в контексте ScriptEngine.

Надеюсь, это поможет вам двигаться вперед в правильном направлении.

Смежные вопросы