gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:42 27 4
gpt4 key购买 nike

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

To activate ES6 support, use --language=es6 on the command line.

这确实适用于 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 问题时,我偶然发现了 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 命令行参数。

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

关于javascript - 我可以从 Java 9 Nashorn 引擎运行 ECMAScript 6 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48911937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com