Jruby" RuntimeHelpers" class已弃用

时间:2016-06-06 08:00:35

标签: java ruby-on-rails ruby jruby

我有一个基于JRuby on rails的项目,现在我正在将这个项目迁移到jruby-9.0.5.0版本。

在代码中,从Java文件调用ruby,如下所示:

    String source = new StringBuilder("require 'java'\n" +
        "\n" +
        "java_package 'jrubysource'\n" +

        "class SystemFilePath\n" +
        "  attr_accessor :topDirCmd, :topDirNames\n" +
        "  java_signature 'SystemFilePath(String topDirCmd)'\n" +
        "  def initialize(topDirCmd)\n" +
        "    @topDirCmd = topDirCmd\n" +
        "    setTopDirectoryNames()\n" +
        "  end\n" +
        "\n" +
        "  java_signature 'void setTopDirectoryNames()'\n" +
        "  def setTopDirectoryNames\n" +
        "    Open3.popen3(@topDirCmd) { |stdin, stdout, stderr, wait_thread|\n" +
        "      out = stdout.read\n" +
        "      err = stderr.read\n" +
        "      if err.size > 0 || out.size == 0\n" +
        "        @topDirNames = nil\n" +
        "        return\n" +
        "      end\n" +
        "      out = out.split(/\\n/).select{|a| a.match(/system_1/) && !a.match(/system_1\\/sim/)}.join(\"\\n\") + \"\\n\";\n" +
        "      topDirNames = out.split(/\\//).select{|a| a.match(/\\n$/) }.map(&:chomp)\n" +
        "      if topDirNames.size == 0 then\n" +
        "        @topDirNames = nil\n" +
        "        return\n" +
        "      end\n" +
        "      @topDirNames = topDirNames.sort.reverse\n" +
        "    }\n" +
        "  rescue Exception => e\n" +
        "    @topDirNames = nil\n" +
        "  end\n" +
        "\n" +
        "end\n" +
        "").toString();
    __ruby__.executeScript(source, "system_file_path.rb");
    RubyClass metaclass = __ruby__.getClass("SystemFilePath");
    metaclass.setRubyStaticAllocator(SystemFilePath.class);
    if (metaclass == null) throw new NoClassDefFoundError("Could not load Ruby class: SystemFilePath");
    __metaclass__ = metaclass;
        }


public void setTopDirectoryNames() {
    @SuppressWarnings("unused")
    IRubyObject ruby_result = RuntimeHelpers.invoke(__ruby__.getCurrentContext(), this, "setTopDirectoryNames"); //Here i am calling ruby code from java file.
        return;
}

现在,根据JRuby API document" RuntimeHelpers" class已被弃用。

该文档没有提供替代API。请引导我选择另一种方法,因为这对我来说是一个阻碍。

1 个答案:

答案 0 :(得分:1)

它是一个内部JRuby API ...你有一个类似的API可用于每个IRubyObject:

而不是

RuntimeHelpers.invoke(__ruby__.getCurrentContext(), this, "setTopDirectoryNames")

尝试:

this.callMethod(__ruby__.getCurrentContext(), "setTopDirectoryNames")