Пытаясь использовать Rhino, getEngineByName("JavaScript") возвращает ноль в OpenJDK 7

Когда я запускаю следующий фрагмент кода, engine переменная установлена ​​в null когда я использую OpenJDK 7 (java-7-openjdk-i386).

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

public class TestRhino {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
            System.out.println(engine.eval("1+1"));
        } catch (ScriptException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Работает нормально с java-6-openjdk и Oracle jre1.7.0, Есть идеи почему?

Я использую Ubuntu 11.10. Все JVM установлены под /usr/lib/jvm,

2 ответа

Решение

[Обновление: это была ошибка, которая теперь исправлена ]

Короче говоря, это может быть ошибкой.

Классы поддержки носорога (com.sun.script.javascript.*) не скомпилированы в rt.jar 1 (хотя я нашел ссылки на это как проблему слияния между Sun и Mozilla, и я знаю, что были проблемы с пространством имен, они существуют в исходном коде OpenJDK 7 и упоминаются в make-файле), и они отсутствуют в resources.jar "s META-INF/services также. Это не относится к OpenJDK 6, который имеет META-INF/services/javax.script.ScriptEngineFactory запись:

#script engines supported

com.sun.script.javascript.RhinoScriptEngineFactory #javascript

Хотя это может быть решением 2 для дистрибутива, письменной причины для этого нет, поэтому я отправил сообщение об ошибке № 982501 в панель запуска Ubuntu OpenJDK 7. Дадим лучший ответ, как только я его получу.

1 согласно этой теме,

Я где-то слышал, что Mozilla не принимает изменения Suns в их основную ветку по неизвестным причинам, но это было до открытия.

Также были некоторые проблемы коллизий, вызванные конфликтующими версиями JRE и версией BYOR (take-you-own-Rhino) (например, ошибка #255149 в панели запуска Ubuntu OpenJDK 7). Однако источник находится в исходном коде OpenJDK 7 и упоминается в make-файле, а порт BSD, упомянутый в приведенном выше потоке, имеет идентичные источники.

2 В соответствии с этой ошибкой Sun #6876736 это решение на основе дистрибутива:

Исходники Rhino не являются частью OpenJDK, это зависит от дистрибутивов, чтобы добавить его.

В некоторой степени, в отличие от того факта, что они зарегистрированы в OpenJDK Mercurial, но я думаю, что идея заключается в том, что Rhino не входит в спецификацию JDK.

Вы должны зарегистрировать сервис Rhino, но я не знаю точно, как, создав файл внутри META-INF

ИЛИ Вы можете пропустить Script API и использовать его напрямую.

Проверьте этот базовый пример:

https://github.com/mozilla/rhino/blob/master/examples/Control.java

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