SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

JRubyチュートリアル

JRubyでJavaとRubyを融合する


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]メニューを選んで行います。コンソールビューに、現在の日時が表示されたでしょうか。

実行すると、GregorianCalendarを使い、現在の日時を表示する
実行すると、GregorianCalendarを使い、現在の日時を表示する

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
JFrameとJLabelでウインドウを表示する
JFrameとJLabelでウインドウを表示する

 こんな感じで、ラベルを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
JButtonを追加し、クリック時のアクションを作成する
JButtonを追加し、クリック時のアクションを作成する

 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」ファイルをきちんと見つけ出し、現在の日時をコンソールに表示するはずです。

次のページ
Rubyスクリプト実行の流れ

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1647 2007/12/13 16:08

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー