Как мне использовать JRuby и Java?

Эта функция все еще поддерживается? Я не могу найти документацию за 2008 год или около того. Это вставка с сайта Oracle...

Во время выполнения API сценариев JSR 223 должны найти соответствующий механизм сценариев для языка сценариев, который вы хотите использовать. Скриптовый движок интерпретирует и выполняет скрипт. Вы можете получить текущие сторонние скриптовые движки JSR 223 из Scripting Project на java.net, загрузив файл jsr223-engine.tar.gz или jsr223-engine и развернув его где-нибудь в вашей системе, например, в scriptengines. каталог.

Но он был написан в 2007 году, и ссылки на все эти ссылки больше не используются. Так что я не могу получить движок JRuby... ничего.

Документ Oracle: http://www.oracle.com/technetwork/articles/dsl/jruby-141877.html

Если кто-нибудь может предоставить мне текущий учебник или документы, которые я могу использовать JRuby внутри Java. В настоящее время у меня успешно работает JRuby, но я не знаю, как настроить Scriptengines на Java.

Спасибо большое.

2 ответа

Вы можете пойти и скачать полный файл 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.java а также jruby-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

работает как ожидалось и вызвал код jruby из Java

Если вы хотите просто вызвать Java из Ruby, это очень просто, вы можете следовать вики, расположенной здесь.

Я нашел текущую документацию на сайте 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 и импортировал ее.

Другие вопросы по тегам