如何在Java 9 Nashorn引擎中通过ScriptEngine启用ECMAScript 6支持?
在Java 9的ScriptEngine中启用ES6支持
我之前也碰到过这个问题——Java 9确实宣称Nashorn引擎支持ECMAScript 6,但默认通过ScriptEngine创建的实例并不会启用ES6特性,和jjs命令行里需要加--language=es6参数一样,我们得在代码里给Nashorn传递对应的启动参数才行。
具体实现步骤
- 先筛选出Nashorn的
ScriptEngineFactory(避免和其他脚本引擎混淆) - 创建引擎时,通过参数映射传入
nashorn.args配置,值为--language=es6
完整代码示例
import javax.script.*; import java.util.List; import java.util.HashMap; public class ES6ScriptEngineDemo { public static void main(String[] args) throws ScriptException { ScriptEngineManager engineManager = new ScriptEngineManager(); List<ScriptEngineFactory> allFactories = engineManager.getEngineFactories(); // 定位Nashorn引擎工厂 ScriptEngineFactory nashornFactory = null; for (ScriptEngineFactory factory : allFactories) { if ("Oracle Nashorn".equals(factory.getEngineName())) { nashornFactory = factory; break; } } if (nashornFactory != null) { // 设置ES6启用参数 HashMap<String, String> engineParams = new HashMap<>(); engineParams.put("nashorn.args", "--language=es6"); // 创建支持ES6的ScriptEngine实例 ScriptEngine es6Engine = nashornFactory.getScriptEngine(engineParams); // 测试ES6特性(比如箭头函数、模板字符串) String testES6Code = """ const greet = name => `Hello, ${name}!`; print(greet("ES6")); """; es6Engine.eval(testES6Code); } else { System.out.println("Nashorn引擎未找到,请确认使用的是Java 9/10版本"); } } }
关键说明
- 直接用
engineManager.getEngineByName("nashorn")创建的引擎默认不开启ES6,运行ES6语法会抛出语法异常,这也是你测试时出错的原因。 nashorn.args参数的作用就是给Nashorn引擎传递启动参数,和jjs --language=es6命令行参数的效果完全一致。- 注意:这个方案仅适用于Java 9和Java 10,Java 11及以后版本已经移除了Nashorn引擎,需要使用其他第三方脚本引擎(比如GraalVM JavaScript)来支持ES6+。
内容的提问来源于stack exchange,提问作者TheZeus121
相关产品推荐
相关产品推荐

