【问题标题】:Add and remove Jar files and classes from inside JavaScript (Rhino / Nashorn)在 JavaScript (Rhino / Nashorn) 中添加和删除 Jar 文件和类
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 2018-11-13
      • 2021-07-14
      • 1970-01-01
      • 2021-10-14
      • 2018-06-12
      • 2017-12-20
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多