我需要在不同的类加载器中执行一些JavaScript代码。如果是Java,则每个任务将在单独的类加载器中运行。现在我需要这个功能在JavaScript中实现。
我是否需要在每个类加载器中创建一个新的ScriptEngine
实例,或者共享一个跨类加载器使用也可以?
我需要在不同的类加载器中执行一些JavaScript代码。如果是Java,则每个任务将在单独的类加载器中运行。现在我需要这个功能在JavaScript中实现。
我是否需要在每个类加载器中创建一个新的ScriptEngine
实例,或者共享一个跨类加载器使用也可以?
根据您的问题,不清楚为什么要寻找这种类加载器隔离。所以,我在此简述nashorn的类加载器 - 也许您会找到您需要的。
nashorn和类加载器:
(1)和(2)无法定制。nashorn代码中存在它是受特权代码的假设。还有一些关于生成的脚本类加载器和适配器加载器的假设。
(3)默认情况下是nashorn引擎创建时的线程上下文类加载器。如果线程上下文类加载器为空,则使用Nashorn的扩展加载器。
因此,如果通过Thread.setContextClassLoader API设置适当的线程上下文加载器后创建Nashorn引擎,您可以控制脚本引擎的“应用程序类加载器”。
如果您愿意使用NashornScriptEngineFactory(nashorn特定API https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html)创建脚本引擎,您也可以以编程方式传递任何类加载器作为“应用程序类加载器”。您可能需要查看接受ClassLoader参数的NashornScriptEngineFactory方法。
除了“应用程序类加载器”之外,还可以选择使用另一个在“应用程序类加载器”之前搜索的附加类加载器。这是通过"-cp"或"-classpath" nashorn命令行选项指定的。请注意,您可以通过“nashorn.args”系统属性或使用NashornScriptEngineFactory类的getScriptEngine方法以编程方式传递来指定脚本引擎的nashorn命令行选项。另请参阅:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes 希望这可以帮助到您。
new ScriptEngineManager().getEngineByName("Nashorn")
吗?换句话说,这总是会创建一个新的ScriptEngine
;在调用这个方法之前,我应该设置我的线程上下文类加载器吗? - igr