金曜日 4 11, 2008

jsr223 engine for JRuby1.1

JRubyを始め、ScalaなどJVMの上で動作するスクリプト言語が盛り上がりを見せていますが、JDK6からプラットフォームとしてのJavaの強化の一環で、JSR223 Scripting for Java Platform をサポートしています。
JVM上で動作するスクリプト言語には元来さまざまな実装がなされていましたが、それを統一的に扱うためにつくられたものがJSR223です。そのためさまざま言語に対応しており、対応スクリプトの情報は、scriptingプロジェクトに集約されています。

ということで、先日JRuby1.1対応版のエンジンがリリースされたので、このJSR223のAPIを使って、JavaからJRubyを呼び出してみたいと思います。
まず残念ながら、JDK6にはJRubyのScriptingEngineは含まれていないので、上記プロジェクトのサイトからダウンロードします。

ダウンロードしたjruby-engine.jarとjruby.jarを$JAVA_HOME/lib/extに配置します。

これでインストールは完了ですが、エンジンが正しく認識されているか否かを確認するために、

$ jrunscript -q

と入力します。出力結果にrubyが表示されていれば、エンジンはインストールされています。
このjrunscriptはスクリプトエンジンを試すためのJDK6に添付されているツールで、Mac以外のOSではデフォルトでECMAScriptのエンジンを使うようになっています。インストールしたjrubyのエンジンを使いたい場合は、

$ jrunscript -l jruby
というふうに-lでエンジン名を渡してやる必要があります。このjrunscriptを使えば、(j)irbのようにインタラクティブにrubyのコードを実行していくことが可能です。ただし1行で終わらない処理はエラーになり実行できません。

$  jrunscript -l ruby
jruby> puts"hello"
hello
jruby> def sayHello(name)
:1: <STDIN>:1: , unexpected end-of-file (SyntaxError)

script error: org.jruby.exceptions.RaiseException: <STDIN>:1: , unexpected end-of-file


ではつぎにjrunscriptを使わずに、javaから呼び出してみたいと思います。

import javax.script.\*;

public class JRubyEval {
public static void main(String[] args) throws Exception {
//Scriptエンジンの取得
ScriptEngineManager sem = new ScriptEngineManager();

// JRubyエンジンの取得
ScriptEngine engine = sem.getEngineByName("ruby");

try {
      //Rubyスクリプトの評価
engine.eval("puts('JSR223からこんにちは')");
} catch (ScriptException exception) {
exception.printStackTrace();
}
}
}
このようにして、JavaからRubyのコードを比較的簡単に呼び出すことができます。

About

Tomo

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日