【问题标题】:How do I use JRuby and Java?如何使用 JRuby 和 Java?
【发布时间】:2015-09-07 07:22:41
【问题描述】:

是否仍支持该功能?我似乎找不到 2008 年左右的任何文档。这是来自 Oracle 网站的插入...

在运行时,JSR 223 脚本 API 必须为您要使用的脚本语言找到合适的脚本引擎。脚本引擎解释并执行脚本。您可以通过下载 jsr223-engines.tar.gz 或 jsr223-engines 文件并将其扩展至系统的某个位置(例如,在 scriptengines 中)从 java.net 上的 Scripting Project 获取当前的 JSR 223 第三方脚本引擎目录。

但它是在 2007 年编写的,所有这些链接的链接都不再使用。 所以我无法获得任何 JRuby 引擎......任何东西。

Oracle 文档:http://www.oracle.com/technetwork/articles/dsl/jruby-141877.html

如果有人可以提供我可以在 Java 中使用 JRuby 的最新教程或文档。 我目前已成功运行 JRuby,但不知道如何在 Java 中设置 Scriptengines。

非常感谢。

【问题讨论】:

  • 我是否只是将 jruby.jar 复制到 java/lib 文件夹中?还是还有更多?

标签: java ruby jruby jruby-java-interop


【解决方案1】:

你可以去here下载完整的jruby .jar文件

然后我就抓了一些示例代码:

import org.jruby.*;
import org.jruby.javasupport.JavaEmbedUtils;  
import java.util.ArrayList;

public class RubyFromJava {
    public String fooString() {
        return "foo";
    }

    public static void main(String[] ARGV) {
        System.out.println("Started");
        RubyFromJava sTest = new RubyFromJava();

        System.out.println("boring: " + sTest.fooString() + "\n"); // outputs foo

        /* This script subclasses the java Object class.
        It is then instantiated and the foobarString method is called. */

        String script = 
            "require 'java'\n" +
            "class RSubclass1 < java.lang.Object\n" + // subclassing java.* is magic
            "   def foobarString\n" +
            "       return @returnString = toString() + 'BAR'\n" +
            "   end\n" +
            "end\n" +
            "rsubclass = RSubclass1.new\n" +
            "puts rsubclass.foobarString\n";

    Ruby runtime = JavaEmbedUtils.initialize(new ArrayList());
    RubyRuntimeAdapter evaler = JavaEmbedUtils.newRuntimeAdapter();

    evaler.eval(runtime, script); // outputs org.jruby.proxy.java.lang.Object$Proxy0@1c7f37dBAR

        System.out.println("-----------------\n");

        /* This script subclasses the RubyFromJava class.
        It is then instantiated and the foobarString method is called. */

        script = 
            "require 'java'\n" +
                        "class RSubclass2 < Java::RubyFromJava\n" + // subclassing non {org,com}.* classpath requires you prefix the class with Java:: or java.
            "   def foobarString\n" +
            "       return @returnString = fooString() + 'BAR'\n" +
            "   end\n" +
            "\n" +
            "rsubclass = RSubclass2.new\n" +
            "puts(rsubclass.foobarString())\n" +
            "end";
                 evaler.eval(runtime, script); // outputs fooBAR
    }
}

将其保存为RubyFromJava.java,我将RubyFromJava.javajruby-complete-9.0.0.0.rc1.jar 放在同一个目录中并运行:

rorra:~ > javac -cp ./jruby-complete-9.0.0.0.rc1.jar RubyFromJava.java
Note: RubyFromJava.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

rorra:~ > java -cp ./jruby-complete-9.0.0.0.rc1.jar:. RubyFromJava
Started
boring: foo

org.jruby.proxy.java.lang.Object$Proxy1@273e5037BAR
-----------------

fooBAR

按预期工作并从 java 调用 jruby 代码

如果您的想法是从 Ruby 中调用 Java,那很容易,您可以关注位于 here 的 wiki

【讨论】:

    【解决方案2】:

    我在 JRuby 网站上找到了当前文档。或者更确切地说是 github/JRuby。

    https://github.com/jruby/jruby/wiki/RedBridge

    这称为“RedBridge”并在此处详细描述。我已经启动并运行了。

    这是我的示例代码:

    import org.jruby.embed.ScriptingContainer;
    
    public class RubyScript {
    
    private RubyScript() {
        int add = 5;
        //initializes Ruby Environment
        ScriptingContainer container = new ScriptingContainer();
        //Sets Ruby var 'ans' as java.lang.Integer: add
        container.put("ans",add);
        container.runScriptlet("puts ans");
        System.out.println(add + add);
    }
    
    public static void main(String[] args) {
        new RubyScript();
    }
    }
    

    这输出: 5 10

    这是预期的。

    感谢 rorra 提供的 jruby-complete.jar 链接,我将 .jar 复制到我的 java lib 文件夹中并导入了它。

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 2018-04-23
      • 1970-01-01
      • 2010-09-23
      • 2011-08-16
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多