Maj*_*nko 9 javascript java jar classpath
基本上我有一个系统,它使用Javascript通过Rhino或Nashorn运行许多"插件"脚本,具体取决于用户安装的JRE.
我还在Java环境中有一个系统,允许在运行时插入额外的.JAR文件.
这一切都很好,花花公子.不过我现在已经碰到过,我想要的东西稍有不同的情况:我想一个.jar文件从加载到类路径中的犀牛/犀牛引擎实例,所以类可用于该实例(该实例只),然后在发动机完成运行时将其移除.
我知道我可以轻松地调用我现有的Java例程来使用JavaScript加载.JAR文件的URL,但是这些类是永久安装的,我无法摆脱它们.
问题基本上源于这样一个事实:用户可能有多个插件具有相同.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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我实际上并不知道它是如何工作的 - 我不是一个强大的Java程序员(我主要做C/C++).我知道你不能从URLClassLoader"卸载"一个URL,所以我不是这么想的.我想,最好的办法是,如果有一种方法可以将.JAR文件添加到"临时"URLClassLoader中,然后我会在执行结束时抛弃它.或者某种方式我可以直接将类加载到脚本引擎而不是主Java ClassPath.
如果这是我可以直接从JavaScript调用的东西,那将是很好的,但我不介意实现一些Java方法来完成工作,如果需要,甚至以某种方式扩展脚本引擎.