javascript - 从 JavaScript (Rhino/Nashorn) 中添加和删除 Jar 文件和类

标签 javascript java jar classpath

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

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

一切都很好,花花公子。但是,我现在遇到了一种情况,我想要一些稍微不同的东西:我想从 Rhino/Nashorn 引擎实例 中将一个 .JAR 文件加载到 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 方法来完成这项工作,或者甚至以某种方式扩展脚本引擎。

最佳答案

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

我找到了 this answer它描述了 ScriptEngine 上下文中的类加载器。

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

关于javascript - 从 JavaScript (Rhino/Nashorn) 中添加和删除 Jar 文件和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42023380/

相关文章:

java jar 类路径错误帮助

android - 在 Android 中从外部 JAR 调用服务

javascript - 是否可以自动密封JS对象?

java - 在对话框 fragment 中使用观察者会导致对话框窗口第二次打开后程序崩溃

java - 为什么使用整型变量会抛出异常?

java - 通过 Annotation Transformer : TestNG 禁用特定测试

java - 如果我需要将补丁应用于库,.jar 存档是否不再有用?

javascript - Uncaught Error : Error calling method on NPObject Error with embedded Youtube Video

javascript - Linux 上的 Node.js 依赖项不兼容

javascript - Bootstrap 隐藏模式在使用 ajax 的 Rails 6 中不起作用