gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:18 24 4
gpt4 key购买 nike

基本上我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com