将Nashorn迁移到GraalVM

时间:2019-06-27 09:36:50

标签: javascript java nashorn jsr223 graalvm

我正在使用OpenJDK 12中的Nashorn JS引擎。Nashorn似乎已被弃用。我正在寻找可用的替代方案。我找到了GraalVM,但是我不确定这是否是最好的。 如何从Java执行GraalVM JavaScript?你有什么例子吗?

Nashorn是从Java使用的:

 NashornScriptEngineFactory nsef = new NashornScriptEngineFactory();
 ScriptEngine engine = nsef.getScriptEngine( BasicDBObject.class.getClassLoader() );
 final Bindings binding = engine.getContext().getBindings(ScriptContext.ENGINE_SCOPE);

2 个答案:

答案 0 :(得分:1)

GraalVM是可靠的方法。我们已经使用了一段时间了,它运行良好,并且JavaScript实现远优于Nashorn(或Rhino)。特别是它符合ECMA2020,它支持Node要求(这是巨大的!),它的性能要好得多,等等。

如果您使用Nashorn,则GraalVM向前迈出了一大步,但是它确实需要进行一些调整,这些调整在GraalVM documentation中已经涵盖了。

答案 1 :(得分:0)

关注GraalVM ScriptEngine

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
bindings.put("polyglot.js.allowHostClassLookup", (Predicate<String>) s -> true);
bindings.put("javaObj", new Object());
engine.eval("(javaObj instanceof Java.type('java.lang.Object'));"); // would not work without allowHostAccess and allowHostClassLookup

注意nashorn兼容模式:

  

这些选项控制应用于评估后的JavaScript代码的沙箱规则,并且默认情况下设置为false,除非应用程序以Nashorn兼容模式(--js.nashorn-compat = true)启动。