Почему getEngineByName («js») возвращает null?

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

Вот мой код:

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

Но engine после этих строк пустое.

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

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

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

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

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


Обновление:

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

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

Теперь я только что открыл новый Java Project, написал эти строки и получил некоторые результаты:

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?

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

Итак, в чем может быть проблема в Android Project и как ее решить?


person Alaa M.    schedule 02.05.2015    source источник
comment
stackoverflow.com/a/10757892/4015623 Посмотрите, поможет ли это   -  person Alex K    schedule 03.05.2015
comment
Я добился успеха с getEngineByExtension("js")   -  person Andrew Thompson    schedule 03.05.2015
comment
@ Эндрю Томпсон, та же проблема ...   -  person Alaa M.    schedule 03.05.2015
comment
@АлааМ. Есть новости по этому вопросу?   -  person Shailendra Madda    schedule 18.06.2021
comment
@ShailendraMadda - Нет, я отказался от проекта.   -  person Alaa M.    schedule 19.06.2021
comment
@АлааМ. Я попробовал это, теперь это работает. val jsEngine = ScriptEngineManager().getEngineByName("rhino") перейдите по этой ссылке   -  person Shailendra Madda    schedule 19.06.2021


Ответы (3)


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

getEngineByName("JavaScript");
                 ^   ^
person Siddharth Kumar    schedule 13.10.2015
comment
Даже я сделал то же самое, но все равно это ноль - person Shailendra Madda; 18.06.2021

По-видимому, при работе в среде IDE, даже если вы используете последнюю версию Java, включающую механизм javascript Nashorn, вам необходимо передать null в конструктор ScriptEngineManager, иначе у него часто не будет движков. Было бы хорошо, если бы он был скомпилирован, похоже, это ошибка IDE. Для меня это было решено путем изменения этого кода:

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

к этому коду:

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

Обратите внимание на null, переданный в вызов конструктора ScriptEngineManager.

person Uncle Iroh    schedule 13.03.2019
comment
Пробовал, но все еще сталкивается с той же проблемой - person Shailendra Madda; 18.06.2021
comment
Я попробовал это, теперь это работает. val jsEngine = ScriptEngineManager().getEngineByName("rhino") перейдите по этой ссылке - person Shailendra Madda; 19.06.2021

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

person René    schedule 11.01.2016