如何使用 ScriptEngineManager 方法 getEngineByName("nashorn") 添加参数?

How to add arguments with the ScriptEngineManager method getEngineByName("nashorn")?

我正在将 Nashorn 与 Java API 8 一起使用。我想保护 javascript 执行以确保代码无法调用 Java 包。

可能如下:

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine("-strict", "--no-java", "--no-syntax-extensions");

然而,直接使用NashornScriptEngineFactory并不是很好。

好的方法是使用ScriptEngineManagerNashornScriptEngineFactoryScriptEngineManager 用来生成 ScriptEngine 实例的工厂。在这个 documentation :

中有解释

This package provides the javax.script integration, which is the preferred way to use Nashorn. You will ordinarily do this to obtain an instance of a Nashorn script engine:

import javax.script.*;
...
ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("Nashorn");

我没有找到使用 ScriptEngineManager 创建 ScriptEngine 并能够提供一些额外参数的解决方案,例如 "-strict", "--no-java", "--no-syntax-extensions".

谁能帮我解决这个问题?提前谢谢你。

嗯,javax.script 是通用的 API,可用于任何脚本语言实现。按照设计,API 根本不提供 "engine configuration options"!

使用 Nashorn 特定 API 的确切问题是什么?您觉得您使用的是特定于引擎的 API 吗?但是你正在使用特定于引擎的选项——其他引擎不支持这些选项。因此,无论如何,您都依赖于特定的引擎实现。

还有另一种系统 属性 方式来指定 Nashorn 选项。您可以定义系统 属性 "nashorn.args"。此 属性 是进程范围的,因此将由您的 Java 进程中创建的所有 Nashorn 引擎使用。

另请参阅:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes