JRubyを使ってみる
こんにちは。JRubyの存在自体はみなさんご存知かと思います。またJRubyって何?って言われると、Java VM上でRubyが動作するってことぐらいは知っているかと思います。
Rubyでの開発でJRubyじゃなきゃだめだ!っていうことはまずないと思うのでJRubyを実際に使ったことがある人は意外と少ないのかなあーと勝手に思っています。私も実際に使ったことがなかったので今回JRubyを触ってみました。
まずは以下のようなJavaプログラムを用意します。
Hoge.java
今回はsample.jarとしてJARファイルを作成しました。
呼び出し側のRubyのソースを用意します。また先ほどのjarファイルをrubyのファイルと同階層に配置します。
test.rb
Hoge.java
実行してみます。
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 ~/.profilesudoコマンドで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/railsjrubyの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 Foo1行目で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.addRuby実行時に二つの引数を受け取ってJavaのクラスを呼び出し、Calcクラスを取得します。取得したCalcクラスのaddメソッドを呼び出し、Ruby実行時の引数を足した結果を表示しています。
実行してみます。
$ jruby test.rb 1 2 3引数の1と2を足した結果が取得できているのが分かります。