首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以从Java9nashorn引擎运行ECMAScript 6吗?

我可以从Java9nashorn引擎运行ECMAScript 6吗?
EN

Stack Overflow用户
提问于 2018-02-21 17:23:43
回答 1查看 6.3K关注 0票数 11

Java9现在包括了ECMAScript 6支持,正如这篇文章所宣称的那样。但是,它并没有解释如何使用ScriptEngine从Java运行它。链接的Java杂志也没有解释这一点。这篇文章说:

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

这确实适用于jjs,但我无法找到一种方法来从Java代码中启用它。为了测试它,我使用了以下代码:

代码语言:javascript
运行
复制
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();
}

除以下例外外,它将失败:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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());
}

这只会产生以下结果:

代码语言:javascript
运行
复制
-----------------------
ECMAScript
ECMA - 262 Edition 5.1

这是否意味着我不能从Java运行ECMAScript 6,而只能使用jjs?还是我错过了什么?

事先谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-22 00:03:35

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

代码语言:javascript
运行
复制
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设置参数。代码:

代码语言:javascript
运行
复制
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命令行参数。

就我个人而言,我更喜欢第一个版本,因为它将在Java1.8上抛出一个ClassNotFoundException,因为NashornScriptEngineFactory并不存在,而第二个版本只是默默地忽略了属性的设置。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48911937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档