Невозможно выполнить es6 на Java 8 с NashornscriptEngine
Я пытаюсь выполнить функцию JavaScript (ES6) в Java 8 (1.8.0_102).
Вот фрагмент кода JavaScript, урезанный вниз.
const myfunc = (args) => {
if (!(args.name || args.zip))
return
const result = {...args}
const { name, zip, date } = result
...
}
Вот мой код Java
public static Object processArbitraryJavaScript(String params)
{
String[] options = new String[] {"--language=es6"};
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
NashornScriptEngine engine = (NashornScriptEngine) factory.getScriptEngine(options);
Object result = null;
try
{
engine.eval(new FileReader("sample.js"));
Invocable inv = (Invocable) engine;
result = inv.invokeFunction("myfunc", params);
}
catch (ScriptException scriptException )
{
LOGGER.error(
"ScriptException encountered trying to write arbitrary JavaScript"
+ scriptException.toString());
}
catch (NoSuchMethodException e) {
LOGGER.error(
"No such Method");
}
return result;
}
Я написал модульный тест, который передает параметры. когда я выполняю тест, я получаю это исключение
ScriptException encountered trying to write arbitrary JavaScriptjavax.script.ScriptException: <eval>:2:5 Expected : but found (
if (!(args.name || args.zip))
^ in <eval> at line number 2 at column number 5
Я закомментировал if
Заявление в JavaScript, но видит дальнейшие ошибки в коде.
ScriptException encountered trying to write arbitrary JavaScriptjavax.script.ScriptException: <eval>:5:8 Expected : but found result
const result = {...args}
^ in <eval> at line number 5 at column number 8
снова дальше вниз, я вижу эту ошибку
ScriptException encountered trying to write arbitrary JavaScriptjavax.script.ScriptException: <eval>:6:6 Expected: but found {
const { name, zip, date } = result
^ in <eval> at line number 6 at column number 6
Я думаю, что это мой scriptEngine читает сценарий как ES6.
что я тут не так делаю?
(кстати, скрипт отлично работает в JS).
1 ответ
Nashorn @Java8_u40+ поддерживает только ограниченное количество функций ES6. Это больше ES5 +, чем ES6. См. JEP 292. Реализация выбранных функций ECMAScript 6 в Nashorn
Функции стрелок - это графики для выпусков обновлений Java 9.
Согласно документации, мы можем включить режим ES6, указав опцию jvm: ["-Dnashorn.args=- language=es6"]
См. https://developer.oracle.com/databases/nashorn-javascript-part2.html
Это работает и с JDK 8, хотя функциональность будет ограничена