我使用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方法
答案 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