Невозможно выполнить 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, хотя функциональность будет ограничена

Другие вопросы по тегам