【问题标题】:Can I run ECMAScript 6 from Java 9 Nashorn engine我可以从 Java 9 Nashorn 引擎运行 ECMAScript 6
【发布时间】:2018-02-21 17:23:43
【问题描述】:

this article 声称,Java 9 现在包括 ECMAScript 6 支持。但是,它没有解释如何使用 ScriptEngine 从 Java 运行它。链接的 Java 杂志也没有解释它。文章内容如下:

要激活 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?还是我错过了什么?

先谢谢了。

【问题讨论】:

    标签: javascript java nashorn


    【解决方案1】:

    在这里浏览 Nashorn 问题时,我偶然发现了this question。它的答案描述了两种传递 Nashorn 引擎命令行参数的方法。 This answer 建议直接使用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 包,它不是官方支持的包。 Another answer 表示您可以使用系统属性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,而第二个版本会默默地忽略属性的设置。

    【讨论】:

    • 我仍然对这个问题的其他解决方案持开放态度,因为这是有缺陷的,我无法在 48 小时内接受自己的答案。
    • 仅供参考:new NashornScriptEngineFactory() 现已弃用
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 2014-08-19
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多