从JavaScript内部添加和删除Jar文件和类(Rhino / Nashorn)

时间:2017-02-03 11:37:45

标签: javascript java jar classpath

基本上我有一个系统,它使用Javascript通过Rhino或Nashorn运行许多“插件”脚本,具体取决于用户安装的JRE。

我在Java环境中也有一个允许在运行时插入额外.JAR文件的系统。

这一切都很好,花花公子。但是我现在遇到了一些需要稍微不同的情况:我想在 Rhino / Nashorn引擎实例中的中将.JAR文件加载到ClassPath中,因此这些类可用于该实例(仅限该实例),然后在引擎完成运行时将其删除

我知道我可以轻松调用现有的Java例程来使用JavaScript加载.JAR文件的URL,但是这些类会被永久安装,我无法摆脱它们。

问题基本上源于这样一个事实:用户可能有多个插件具有相同.JAR文件的不同版本(它由第三方提供,并以不同方式用于多个不同的插件),我需要插件来能够加载正确的一个,然后再抛弃它。

我现有的网址加载程序是:

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方法来完成工作,如果需要,甚至以某种方式扩展脚本引擎。

1 个答案:

答案 0 :(得分:6)

要隔离插件特定的类,您可能需要创建一个单独的(自定义)类加载器实例并将其传递给java脚本引擎。由特定类加载器加载的任何类只对特定的Java脚本引擎可见。

我发现this answerScriptEngine的上下文中描述了类加载器。

我希望这能帮助你朝着正确的方向前进。