В основном у меня есть 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 для выполнения задания, если это необходимо, или даже в некоторой степени расширять механизм сценариев.