如何在Java中解析包含class关键字的JavaScript代码?
解决方案
问题原因
你遇到的报错是因为使用的Rhino和JDK内置的Nashorn引擎默认不支持ES6及更高版本的JavaScript语法,class关键字是ES2015(ES6)才正式加入的特性,旧版本引擎会将其识别为保留字禁止使用。
可选解决方案
方案1:配置新版Rhino开启ES6支持
新版Rhino已经支持ES6语法,你只需要升级Rhino依赖,再手动配置脚本上下文的语言版本即可:
首先引入最新版Rhino的Maven依赖:
<dependency> <groupId>org.mozilla</groupId> <artifactId>rhino</artifactId> <version>1.7.14</version> <!-- 可替换为最新正式版 --> </dependency> <dependency> <groupId>org.mozilla</groupId> <artifactId>rhino-engine</artifactId> <version>1.7.14</version> </dependency>
修改Java代码指定ES6版本:
public static void main(String[] args) throws Throwable { RhinoScriptEngineFactory factory = new RhinoScriptEngineFactory(); RhinoScriptEngine engine = (RhinoScriptEngine) factory.getScriptEngine(); // 配置上下文开启ES6支持 Context cx = Context.enter(); cx.setLanguageVersion(Context.VERSION_ES6); try { engine.eval(new FileReader("js/SomeClass.js")); } finally { Context.exit(); } }
方案2:使用GraalVM Polyglot API(推荐)
GraalVM的JS引擎是Oracle官方用来替代Nashorn的方案,对ES最新特性支持最完善,性能也优于老旧的Rhino和Nashorn。
首先引入GraalVM JS的依赖:
<dependency> <groupId>org.graalvm.js</groupId> <artifactId>js</artifactId> <version>23.1.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js-scriptengine</artifactId> <version>23.1.0</version> </dependency>
执行代码示例:
public static void main(String[] args) throws Throwable { ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js"); engine.eval(new FileReader("js/SomeClass.js")); // 测试调用JS方法 Invocable invocable = (Invocable) engine; invocable.invokeFunction("start"); }
方案3:转译ES6代码为ES5
如果你无法更换引擎,可以提前用Babel把包含class在内的ES6+语法转译为ES5兼容代码,再交给旧引擎执行,该方案需要额外配置转译流程。
内容的提问来源于stack exchange,提问作者user14787178
相关产品推荐
相关产品推荐

