【问题标题】:How does one tell JRuby to reload/refresh a Java Class?如何告诉 JRuby 重新加载/刷新 Java 类?
【发布时间】:2010-06-08 16:08:02
【问题描述】:

我正在使用 JRuby 编写 Java 脚本。通过使用 JRebel,我可以自动将更改的 Java 类重新加载到 JRuby JVM 中,而无需重新启动。当我添加一个新的 Java 方法时,JRebel 会自动重新加载该类。我的问题是我不能直接调用这个新方法。我可以要求 JRuby 为新加载的 Java 类刷新其方法缓存吗?我唯一的解决方法是使用 java_send 反射性地调用新方法。

例子:

步骤 1. 启动 irb 会话并 java_import 一个 Java 类(比如 Person)。

步骤 2. 为 Person 添加一个 getName 方法并编译。

步骤 3. 创建一个 Person 实例 (p = Person.new)。 JRebel 将显示它重新加载了 java 类。

第 4 步。调用 p.get_name 会导致 NoMethodError,但 p.java_send('getName') 会调用新实现的 getName 方法

【问题讨论】:

    标签: jruby


    【解决方案1】:

    我找到了一种使用 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 没有对类声明进行更改,只对已知方法的内容进行了更改。

    【讨论】:

      【解决方案2】:

      您是否设法通过 -javaagent 选项使其被 JIRB 识别并启动 jrebel 代理?

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

      我试过这个,但没有看到它工作,java_send 也是如此

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 2012-03-08
        • 2011-06-12
        相关资源
        最近更新 更多