• AWS Summit Tokyo 2014 ~「あなた」のクラウドがここに ~

JRubyを使ってみる

images
こんにちは。JRubyの存在自体はみなさんご存知かと思います。またJRubyって何?って言われると、Java VM上でRubyが動作するってことぐらいは知っているかと思います。
Rubyでの開発でJRubyじゃなきゃだめだ!っていうことはまずないと思うのでJRubyを実際に使ったことがある人は意外と少ないのかなあーと勝手に思っています。私も実際に使ったことがなかったので今回JRubyを触ってみました。

JRubyの環境を作る

今回はubuntu上で動作させます。 まずは、Javaをインストールします。
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
次にJRubyをインストールします。執筆現在は最新のバージョンは1.7.12になります。これは通常のRuby(MRI)の1.9.3に互換しています。
$ cd /usr/local/src/
$ sudo wget http://jruby.org.s3.amazonaws.com/downloads/1.7.12/jruby-bin-1.7.12.tar.gz
$ sudo tar zxvf jruby-bin-1.7.12.tar.gz 
$ sudo mv jruby-1.7.12/ /usr/local/jruby
パスを通しておきます。
$ vi ~/.profile
最後の行に追加します。
PATH="$PATH:/usr/local/jruby/bin"
パスを反映させます。
$ source ~/.profile
sudoコマンドでjrubyが実行できるようにしておきます。
$ vi ~/.bashrc
最後の行に追加します。
alias sudo="sudo env PATH=$PATH"
パスを反映させます。
$ source ~/.bashrc
以上でインストールは完了しました。 動作するかコマンドを実行してみます。
$ jruby -v
実行するとこんな感じに表示されます。
jruby 1.7.12 (1.9.3p392) 2014-04-15 643e292 on Java HotSpot(TM) Client VM 1.7.0_60-b19 [linux-i386]

railsをインストールする

次にrailsをインストールしたいと思います。
$ sudo jruby -S gem install rails
これでrailsのインストールは完了です。どこにインストールされたか確認してみます。
$ sudo which rails
/usr/local/jruby/bin/rails
jrubyのbin配下にインストールされたことが分かります。 railsのバージョンを確認してみます。
$ rails -v
執筆現在のバージョンは4.1.1になっていました。

プロジェクトを作成して動かしてみる

railsプロジェクトを作成します。ここではgemはプロジェクト配下にインストールするようにします。
$ rails new sample_app --skip-bundle
$ cd sample_app
$ bundle install --path vendor/bundler
動かしてみます。
$ rails s
これでhttp://localhost:3000にアクセスすればrailsの画面が表示されます。Ruby(MRI)と一緒ですね。

Javaのプログラムを呼び出してみる

とりあえずはJRubyを動かしてみましたが、ここまでの話ですと特にJRubyメリットを感じないかなと思います。そこで次はJVMで動作している利点としてJavaのプログラムを呼び出してみたいと思います。
まずは以下のようなJavaプログラムを用意します。
Hoge.java
 
package jp.classmethod;

public class Hoge {

	public String getFoo() {
		return "Foo";
	}
}
getFooメソッドを呼び出すと文字列の"Foo"が返却される簡単なHogeクラスです。作成したらjarファイルとして出力します。(Eclipseならメニューのファイル->エクスポート->JavaからJARファイルを選択して出力)
今回はsample.jarとしてJARファイルを作成しました。
呼び出し側のRubyのソースを用意します。また先ほどのjarファイルをrubyのファイルと同階層に配置します。
test.rb
require 'sample.jar'
import 'jp.classmethod.Hoge'

hoge = Hoge.new
puts hoge.getFoo
実行するとFooが表示されるのが確認できます。
$ jruby test.rb
Foo
1行目でrequireを使ってjarファイルを読み込みます。2行目のimportでパッケージ+クラス名を指定します。

戻り値がオブジェクトの場合

では次にjarファイルを実行したらJavaのオブジェクトが返却される場合についてやってみたいと思います。先ほどのHogeクラスにgetCalcメソッドを追加します。戻り値としてCalcオブジェクトが返却されます。
Hoge.java
package jp.classmethod;

public class Hoge {

	public String getFoo() {
		return "Foo";
	}
	
	public Calc getCalc(int value1, int value2) {
		return new Calc(value1, value2);
	}
}

Calc.java
package jp.classmethod;

public class Calc {

	private int value1, value2;
	public Calc(int value1, int value2) {
		this.value1 = value1;
		this.value2 = value2;
	}
	
	public int add() {
		return this.value1 + this.value2;
	}
}
test.rb
require 'sample.jar'
import 'jp.classmethod.Hoge'

value1 = ARGV[0].to_i
value2 = ARGV[1].to_i
hoge = Hoge.new
calc = hoge.getCalc(value1, value2)
puts calc.add          
Ruby実行時に二つの引数を受け取ってJavaのクラスを呼び出し、Calcクラスを取得します。取得したCalcクラスのaddメソッドを呼び出し、Ruby実行時の引数を足した結果を表示しています。
実行してみます。
$ jruby test.rb 1 2
3
引数の1と2を足した結果が取得できているのが分かります。

まとめ

JRubyを使うことでJavaのプログラムを簡単に呼び出せました。既にJavaの資産がありそれを使いたい、けどrailsで実装したいというケースがあった場合はJRubyを使うことを検討してみるのもいいのではないでしょうか。その他にもJRubyを使うことでJavaの環境を利用できることが色々ありますので、また紹介していければと思います。
  • AWS Summit Tokyo 2014 ~「あなた」のクラウドがここに ~