如何告诉JRuby重新加载/刷新Java类?

时间:2010-06-08 16:08:02

标签: jruby

我使用JRuby编写Java脚本。通过使用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 个答案:

答案 0 :(得分:3)

我找到了一种用JRebel运行JRuby的方法!

诀窍是使用Nailgun服务器启动JRuby,该服务器使用JRebel,如下所示:

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

现在可以使用Nailgun启动rails应用程序:

jruby --ng -S rails server

如果rails从某个地方使用Java类并且它可以找到正确的rebel.xml,那么JRebel将获取更改并且您不再需要重新启动rails。

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

JRuby / JRebel仍然需要更多工作,因为JRuby没有获取类声明的更改,只有已知方法的内容。

答案 1 :(得分:0)

您是否设法传递-javaagent选项以便JIRB识别并启动jrebel代理?

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

我已经尝试了这个,但是看不到它,还有java_send