繁体   English   中英

我可以从 Java 9 Nashorn 引擎运行 ECMAScript 6

[英]Can I run ECMAScript 6 from Java 9 Nashorn engine

本文所述,Java 9 现在包括 ECMAScript 6 支持。 但是,它没有解释如何使用ScriptEngine从 Java 运行它。 链接的 Java 杂志也没有解释。 文章说如下:

要激活 ES6 支持, --language=es6在命令行上使用--language=es6

这确实适用于jjs ,但我找不到如何从 Java 代码启用它的方法。 为了测试它,我使用了以下代码:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...
ScriptEngine engine = new ScriptEngineManager().getEngineByMimeType("application/javascript");
try {
    engine.eval("const a = 20;");
} catch (ScriptException e) {
    e.printStackTrace();
}

它失败,但有以下异常:

javax.script.ScriptException: <eval>:1:0 Expected an operand but found const
const a = 20;
^ in <eval> at line number 1 at column number 0
    [STACK TRACE OMITTED]

我尝试使用以下代码列出所有可用的ScriptEngineFactories

import java.util.List;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
...
List<ScriptEngineFactory> factories = new ScriptEngineManager().getEngineFactories();
for (ScriptEngineFactory factory : factories) {
    System.out.println("-----------------------");
    System.out.println(factory.getLanguageName());
    System.out.println(factory.getLanguageVersion());
}

这仅输出以下内容:

-----------------------
ECMAScript
ECMA - 262 Edition 5.1

这是否意味着我不能从 Java 运行 ECMAScript 6 并且只能使用jjs 或者我错过了什么?

先谢谢了。

在浏览 Nashorn 问题时,我偶然发现了这个问题 它的答案描述了如何传递 Nashorn 引擎命令行参数的两种方式。 这个答案建议直接使用NashornScriptEngineFactory ,代码如下:

import javax.script.ScriptEngine;
import javax.script.ScriptException;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
...
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine("--language=es6");
try {
    engine.eval("const a = 20;\n"
            + "print(a);");
} catch (ScriptException e) {
    e.printStackTrace();
}

尽管这有效,但它不是一个好的解决方案,因为它使您使用不是官方支持的包的jdk包。 另一个答案说您可以使用系统属性nashorn.args设置参数。 代码:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
...
System.setProperty("nashorn.args", "--language=es6");
ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
try {
    engine.eval("const a = 20;\n"
            + "print(a);");
} catch (ScriptException e) {
    e.printStackTrace();
}

这也不是一个好的方法,因为它依赖于:

  • 现有的 Nashorn 引擎在其他 Java 发行版上可能并非如此,以及
  • Nashorn 引擎是最新的以支持language命令行参数。

我个人更喜欢第一个版本,因为它会在 Java 1.8 上抛出ClassNotFoundException ,因为那里不存在 NashornScriptEngineFactory,而第二个版本只会默默地忽略属性的设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM