我可以从Java 9 Nashorn引擎运行ECMAScript 6吗?
如本文所述,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]
我试着用下面的代码列出所有可用的ScriptEngineFactory:
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();
}
这也不是一个很好的做法,因为它依赖于:
language
命令行参数。 我个人更喜欢第一个版本,因为它会在Java 1.8上抛出ClassNotFoundException,因为NashornScriptEngineFactory在那里不存在,而第二个版本会默默地忽略属性的设置。
链接地址: http://www.djcxy.com/p/41367.html