Почему getEngineByName("js") возвращает ноль?

Что бы я ни старался, getEngineByName() продолжает возвращать ноль.

Вот мой код:

final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine engine = manager.getEngineByName("js");

Но engine имеет значение null после этих строк.

Я также попробовал:

  • getEngineByName("javascript")
  • getEngineByName("nashorn")

Они все возвращаются null, На самом деле, manager.getEngineFactories() показывает пустой массив - это значит, что фабрики вообще отсутствуют.

Эти 2 ответа предлагают прохождение null конструктору, но у меня это не сработало:

И этот ответ говорит, что это ошибка, которая была исправлена.


Обновить:

Это был проект приложения для Android в Eclipse.

Я не знал, что это сильно отличается от проекта Java.

Сейчас я только что открыл новый Java-проект, написал следующие строки и получил некоторые результаты:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;

public class TestClass {

    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = scriptEngineManager.getEngineByName("js");
    }
}

engine не нуль!

Также, javax.script.* был успешно импортирован, как будто он уже там (встроенный). Это потому что я использую Java 8?

В этом предыдущем (андроид) проекте я использовал скачанный отсюда javax.script.

Так в чем же заключается проблема в Android Project и как ее решить?

4 ответа

Вы должны написать аргумент заглавными буквами, как показано ниже:

getEngineByName("JavaScript");
                 ^   ^

Apparently when running in an IDE even if you are on a recent version of Java that includes the Nashorn javascript engine you have to pass null into the ScriptEngineManager constructor or else it often won't have engines. It'd be fine when actually compiled, seems to be an IDE error. For me it was resolved by changing this code:

mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("JavaScript");

to this code:

mgr = new ScriptEngineManager(null);
engine = mgr.getEngineByName("JavaScript");

Note the null passed into the ScriptEngineManager constructor call.

Ваша версия Java не включает движок JavaScript. Java 8 включает движок Jashascript Nashorn и в целом лучше поддерживает совместимость Java <-> JavaScript. Для более старых версий Java вы можете поместить Rhino в путь к классам и использовать его.

Как насчет добавления модуля jdk.scripting.nashorn к модульному графу?

      java --add-modules jdk.scripting.nashorn
Другие вопросы по тегам