我正在使用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);
答案 0 :(得分:1)
GraalVM是可靠的方法。我们已经使用了一段时间了,它运行良好,并且JavaScript实现远优于Nashorn(或Rhino)。特别是它符合ECMA2020,它支持Node要求(这是巨大的!),它的性能要好得多,等等。
如果您使用Nashorn,则GraalVM向前迈出了一大步,但是它确实需要进行一些调整,这些调整在GraalVM documentation中已经涵盖了。
答案 1 :(得分:0)
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)启动。