我需要执行一些javascript代码' inside'不同的类加载器。如果是java,则每个任务都将在单独的类加载器中运行。现在我需要这个是javascript。
我是否需要在每个类加载器中创建ScriptEngine
的新实例,或者可以跨类加载器共享一个实例?
答案 0 :(得分:11)
从您的问题中,您不清楚为什么要寻找这样的类加载器隔离。所以,我在这里总结了nashorn的类加载器 - 可能是,你会得到你想要的东西。
Nashorn和类加载器:
(1)和(2)无法定制。在nashorn代码中有一些假设它是一个特权代码。有关genarated脚本类加载器和适配器加载器的假设。
(3)默认情况下是nashorn引擎创建时的线程上下文类加载器。如果线程上下文类加载器为null,则使用Nashorn自己的加载器 - 扩展加载器。
因此,如果在通过Thread.setContextClassLoader API设置合适的线程上下文加载器后创建Nashorn引擎,则可以控制脚本引擎的“app class loader”。
如果您可以使用NashornScriptEngineFactory(nashorn特定API https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html)来创建脚本引擎,您也可以通过编程方式将任何类加载器作为“app class loader”传递。您可能想要查看接受ClassLoader参数的NashornScriptEngineFactory方法。
除了“app class loader”之外,您还可以使用在“app class loader”之前搜索的另一个其他类加载器。这由“-cp”或“-classpath”nashorn命令行选项指定。请注意,您可以通过“nashorn.args”系统属性为脚本引擎指定nashorn命令行选项,或使用NashornScriptEngineFactory类的getScriptEngine方法以编程方式传递。另见:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
希望这有帮助。