#jruby #nameerror #scriptengine
#jruby #ошибка nameerror #scriptengine
Вопрос:
Я столкнулся с интересной проблемой при обновлении JRuby с 1.5.2 до 1.6.1. Она не давала мне покоя все выходные, пока я не свел ее к нескольким строкам. Похоже, что где-то могла быть введена ошибка, которая вызывает сбой, когда getEngineByName вызывается слишком много раз. Например, следующий суперпростой код работает в 1.5.2, но завершается сбоем в 1.6.1 примерно после 10-20 итераций:
ScriptEngineManager factory = new ScriptEngineManager();
for (int i = 0; i < 10000; i ) {
System.out.println(i);
ScriptEngine engine = factory.getEngineByName("jruby");
engine.eval("puts 'hello'");
}
Результат в 1.6.1 после #16:
NameError: uninitialized constant #<Class:0x101a41cc7>::ARGV
const_missing at org/jruby/RubyModule.java:2526
Exception in thread "main" java.lang.NullPointerException
at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:110)
at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93)
at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:154)
at JRubyTestFailure.main(JRubyTestFailure.java:16)
Чтобы избежать проблемы, все, что вам нужно сделать, это переместить getEngineByName за пределы цикла:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("jruby");
for (int i = 0; i < 10000; i ) {
System.out.println(i);
engine.eval("puts 'hello'");
}
К сожалению, это не так просто для моего приложения по архитектурным причинам. Возможно, мне придется поместить отдельные экземпляры ScriptEngine в ThreadLocal. Однако меня беспокоит непонимание того, почему это не удается.
Есть идеи о том, почему я получаю эту ошибку «NameError: неинициализированная константа» от? Нет, я еще не пробовал проверять исходный код…
Комментарии:
1. Ой, только что столкнулся с этим сам. У вас возникла проблема с jruby?
2. Возникло здесь: jira.codehaus.org/browse/JRUBY-5734