Пытаясь использовать 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