Rubyプロジェクトでスクリプトを動かす
では、まずRubyプロジェクトでスクリプトを実行してみましょう。[ファイル]-[新規]-[プロジェクト]メニューを選び、現れたダイアログから「Ruby」項目内の「Rubyプロジェクト」を選択します。そして次へ進み、適当にプロジェクト名を入力してプロジェクトを作成してください(ここでは「RubySample」としておきます)。
プロジェクトができたら、Rubyのスクリプトファイルを作成します。[ファイル]-[新規]-[その他]メニューを選び、「Ruby」内の「Empty Ruby Script」を選択してファイル名を入力します(ここでは「sample.rb」とします)。
作成したRubyのスクリプトファイルは、Ruby Source Editorという専用エディタで開かれます。これはCtrl+スペースキーで候補の一覧がポップアップ表示されたり、スクリプトの要素の色分け表示がされるなど、Eclipseの基本的なエディタ機能を一通り備えています。
さて、Rubyの基本的な文法等については割愛します。ここでは「JRubyを使って、RubyからJavaの機能を利用する」方法について説明します。まずは、実際に簡単なスクリプトを動かしてみましょう。
require 'java' include_class 'java.util.GregorianCalendar' cal = GregorianCalendar.new date = cal.getTime puts date.toString
作成したスクリプトファイルに、このようにスクリプトを記述して実行してみましょう。実行は、スクリプトファイルを選択し、[実行]-[実行]-[Ruby Script]メニューを選んで行います。コンソールビューに、現在の日時が表示されたでしょうか。

Javaクラスライブラリを利用する基本
JRubyで、RubyスクリプトからJavaのクラスライブラリを利用する場合、以下のような手続きが必要となります。
require 'java'
まず、最初にrequire 'java'をすることでJava関連の機能を利用できるようになります。続いて利用するクラスをインクルードします。
include_class 'java.util.GregorianCalendar'
Javaクラスライブラリのクラスを使用する場合、include_classを使ってクラスを1つずつ指定していきます。これは、'java.util.*'のようにワイルドカードを使って指定することはできません。面倒ですが、使用するクラスすべてについて記述をしてください(ただし、パッケージごとincludeすることが不可能というわけではなく、別途include_packageというものも用意されています。ここではinclude_classで個別にincludeすることにします)。
これで、include_classしたクラスが使えるようになりました。後は、インスタンスを作成し、メソッドを呼び出してJavaの処理とまったく同じ感覚でスクリプトを記述していきます。
cal = GregorianCalendar.new date = cal.getTime puts date.toString
ここでは、GregorianCalendarインスタンスを作成し、getTimeして得られたDateをputsで表示しています。やっていることはJavaではおなじみのことですが、Rubyの文法に従って書かれているのでずいぶんと印象が変わって見えますね。
基本が分かれば、Javaクラスライブラリを使ったスクリプトは案外簡単に書けるようになります。例えば、Swingを使ったウインドウを表示させてみましょう。
require 'java'
include_class 'javax.swing.JFrame'
include_class 'javax.swing.JLabel'
frame = JFrame.new 'FRAME'
label = JLabel.new 'This is JRuby'
frame.add label
frame.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
frame.setSize 300,200
frame.visible = true

こんな感じで、ラベルを1つ組み込んだJFrameウインドウが画面に表示されます。実に簡単ですね。では、もう少し凝ったことをやってみましょう。ボタンを追加し、ボタンクリックの処理を追加してみます。
require 'java' include_class 'java.awt.BorderLayout' include_class 'java.awt.Font' include_class 'javax.swing.JFrame' include_class 'javax.swing.JLabel' include_class 'javax.swing.JButton' include_class 'java.awt.event.ActionListener' class MyAction include ActionListener def actionPerformed ev $label.text = 'ok' end end def newFrame frame = JFrame.new frame.title = 'FRAME' $label = JLabel.new 'This is JRuby' $label.font = Font.new 'Serif',Font::BOLD,24 frame.add $label,BorderLayout::CENTER btn = JButton.new 'click' btn.addActionListener MyAction.new frame.add btn,BorderLayout::SOUTH frame.set_default_close_operation JFrame::EXIT_ON_CLOSE frame.setSize 250,150 frame.visible = true end newFrame

JFrame作成の処理が長くなってきたのでdefでまとめてあります。このあたりになってくると、実はいろいろとJRubyに問題があることが見えてきます。まず、Javaでは当たり前の「JFrameを継承したクラスを定義してnewする」というやり方が、現状のJRubyではうまく機能しないようです。このため、JFrame.newしたものにいろいろと追加をして作っていくことになります。
またActionListenerの実装もかなり変わった形をしています。classを定義し、include ActionListenerでActionListenerの機能を取り込んでいます。このあたりは、かなり癖があると言わざるを得ません。
やはり、「RubyからJavaのクラスライブラリが使える」とは言っても、AWTやSwingなどを使ってGUIアプリケーションを作成するにはまだまだ、ということでしょう。このあたりは、今後のバージョンアップに期待したいところです。
JavaからRubyスクリプトを実行する
Javaプログラマにとっては、Rubyのスクリプトそのものよりも「それをどうやってJavaから利用できるのか」ということではないでしょうか。Javaプロジェクトを作成し、そこにRubyスクリプトファイルを用意して、Java内から呼び出してみましょう。
まず、[ファイル]-[新規]-[プロジェクト]メニューで「Javaプロジェクト」を新たに作成します(ここでは「sample」としておきます)。作成後、先に用意したJRubyのライブラリをプロジェクトに追加しておいてください。そして、先ほどと同様にRubyスクリプトファイルを作成します。今回は、「src」フォルダ内に「test.rb」として用意することにしましょう。そして最後に、Javaクラスの作成です。ここでは、「jp.codezine.RubySample」というクラスとして作成することにします。
では、スクリプトとJavaクラスのソースコードを作成しましょう。まずは、「test.rb」ファイルからです。ここでは、先に書いた日時を表示するスクリプトをアレンジして使います。
require 'java' include_class 'java.util.GregorianCalendar' cal = GregorianCalendar.new date = cal.getTime date.toString
続いて、Javaクラスのソースコードです。今回は、「test.rb」を実行し、その結果を受け取って表示させてみることにします。
package jp.codezine; import java.io.*; import org.jruby.Ruby; import org.jruby.runtime.ThreadContext; import org.jruby.runtime.builtin.IRubyObject; public class RubySample { public static void main(String[] args) { Ruby ruby = Ruby.getDefaultInstance(); try { FileReader reader = new FileReader("test.rb"); IRubyObject obj = ruby.evalScript(reader, ""); System.out.println("Result: " + obj); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
できあがったら、[実行]-[実行]-[Javaアプリケーション]メニューでプログラムを実行してみましょう。おそらく、エラーになるはずです。これは、実行の構成でデフォルトの作業ディレクトリがプロジェクトのディレクトリに設定されているため、「test.rb」ファイルが見つからないのが原因です。
通常、Javaプロジェクトではビルドされたプログラムは「bin」フォルダにまとめられますので、このbinが作業ディレクトリとなるようにしておく必要があります。
[実行]-[実行ダイアログを開く]メニューを選び、実行の「構成の作成、管理、および実行」ウインドウを呼び出してください。そして、先ほどの実行で作成された実行構成(Javaアプリケーション内に「RubySample」として作成されているはずです)を選択して、[引数]タブの[作業ディレクトリー]を[その他]にし、以下の値を記述します。
${project_loc}\bin
これでプロジェクトのbinディレクトリが作業ディレクトリとなります。このまま[適用]ボタンで変更を適用し、[実行]ボタンを押して実行すれば、今度はプログラムは「test.rb」ファイルをきちんと見つけ出し、現在の日時をコンソールに表示するはずです。

