我可以 运行 来自 Java 9 Nashorn 引擎的 ECMAScript 6
Can I run ECMAScript 6 from Java 9 Nashorn engine
Java 9 现在包括 ECMAScript 6 支持,如 this article. However, it doesn't explain how to run it from Java with ScriptEngine 所声称的那样。链接的 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. Its answers describe two ways how to pass Nashorn engine commandline arguments. This answer suggests to use 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 引擎 up-to-date 支持
language
命令行参数。
我个人更喜欢第一个版本,因为它会在 Java 1.8 上抛出一个 ClassNotFoundException,因为那里不存在 NashornScriptEngineFactory,而第二个版本只会默默地忽略设置属性。
Java 9 现在包括 ECMAScript 6 支持,如 this article. However, it doesn't explain how to run it from Java with ScriptEngine 所声称的那样。链接的 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. Its answers describe two ways how to pass Nashorn engine commandline arguments. This answer suggests to use 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 引擎 up-to-date 支持
language
命令行参数。
我个人更喜欢第一个版本,因为它会在 Java 1.8 上抛出一个 ClassNotFoundException,因为那里不存在 NashornScriptEngineFactory,而第二个版本只会默默地忽略设置属性。