作者:手机用户2502879933 | 来源:互联网 | 2023-02-13 08:42
基本上我有一个系统,它使用Javascript通过Rhino或Nashorn运行许多"插件"脚本,具体取决于用户安装的JRE.
我还在Java环境中有一个系统,允许在运行时插入额外的.JAR文件.
这一切都很好,花花公子.不过我现在已经碰到过,我想要的东西稍有不同的情况:我想一个.jar文件从加载到类路径中的犀牛/犀牛引擎实例,所以类可用于该实例(该实例只),然后在发动机完成运行时将其移除.
我知道我可以轻松地调用我现有的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方法来完成工作,如果需要,甚至以某种方式扩展脚本引擎.
1> skadya..:
要隔离插件特定的类,您可能需要创建一个单独的(自定义)类加载器实例并将其传递给java脚本引擎.由特定类加载器加载的任何类只对特定的Java脚本引擎可见.
我发现这个答案描述了上下文中的类加载器ScriptEngine
.
我希望这能帮助你朝着正确的方向前进.