【发布时间】:2017-06-20 18:34:06
【问题描述】:
基本上,我有一个 Java 系统,它通过 Rhino 或 Nashorn 使用 Javascript 运行许多“插件”脚本,具体取决于用户安装的 JRE。
我在 Java 环境中还有一个系统,允许在运行时插入额外的 .JAR 文件。
这一切都很好,花花公子。但是我现在遇到了一种情况,我想要一些稍微不同的东西:我想将一个 .JAR 文件从 Rhino/Nashorn 引擎实例 within 加载到 ClassPath 中,以便该实例可以使用这些类(仅限该实例),然后在引擎完成运行时移除它们。
我知道我可以很容易地调用我现有的 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();
}
}
现在我实际上并不知道它是如何工作的——我不是一个强大的 Java 程序员(我主要做 C/C++)。我知道你不能从 URLClassLoader 中“卸载”一个 URL,所以我不是在问这个。我想,最好的办法是如果有一种方法可以将 .JAR 文件添加到“临时” URLClassLoader 中,然后在执行结束时将其丢弃。或者我可以通过某种方式将类直接加载到脚本引擎中,而不是主要的 Java ClassPath。
如果我可以直接从 JavaScript 调用它,那就太好了,但如果需要,我不介意实现一些 Java 方法来完成这项工作,甚至以某种方式扩展脚本引擎。
【问题讨论】:
标签: javascript java jar classpath