Как можно сказать JRuby перезагрузить / обновить класс Java? - PullRequest
4 голосов
/ 08 июня 2010

Я пишу сценарий Java, используя JRuby. Используя JRebel, я могу автоматически перезагружать измененные классы Java в JRuby JVM без перезапуска. Когда я добавляю новый метод Java, JRebel автоматически перезагружает класс. Моя проблема в том, что я не могу вызвать этот новый метод напрямую. Могу ли я попросить JRuby обновить свой кэш методов для вновь загруженного Java-класса? Мой единственный обходной путь - рефлексивно вызывать новый метод, используя java_send.

Пример:

шаг 1. Запустите сеанс irb и java_import Java-класс (скажем, Person).

шаг 2. Добавьте метод getName в Person и скомпилируйте.

шаг 3. Создайте экземпляр Person (p = Person.new). JRebel покажет, что он перезагрузил класс Java.

шаг 4. Вызов p.get_name приводит к ошибке NoMethodError, но p.java_send ('getName') вызывает вновь реализованный метод getName

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Я нашел способ запустить JRuby с JRebel!

Хитрость заключается в том, чтобы запустить JRuby с сервером Nailgun, который использует JRebel следующим образом:

jruby --ng-server -J-javaagent:/Applications/ZeroTurnaround/JRebel/jrebel.jar -J-noverify

Теперь приложение railsначалось с Nailgun:

jruby --ng -S rails server

Если rails использует откуда-то классы Java и может найти правильный rebel.xml, JRebel получит изменения, и вам больше не нужно перезапускать rails.

$CLASSPATH << "#{RAILS_ROOT}/java/target/classes"

JRuby / JRebel по-прежнему нуждается в дополнительной работе, поскольку JRuby не принимает изменения в объявлениях класса, а только содержимое известных методов.

0 голосов
/ 12 декабря 2010

Вам удалось передать опцию -javaagent, чтобы JIRB распознал ее, и запустить агент jrebel?

jruby -J-noverify -J-javaagent:/path/to/jrebel.jar -S jirb

Я пробовал это, но не вижу, как это работает, также с java_send

...