JRakeってどうなんだろう?

巷でJRakeなるものが注目を集めている。JRakeというのは、JRubyとRakeの組み合わせを指しており、これがJavaプログラムのビルドに高いパフォーマンスを発揮するのでは?と期待されているのだ。
JRubyは、RubyインタープリタJava実装である。

RakeRuby実装のMakeみたいなもの。Makeに期待する動作はちゃんと実現できるのはもちろん、内部DSLであるためビルドスクリプト中でRubyの強力な文法をフルに利用できるというすごいビルドツールである。

なるほど、Javaプログラムのビルドをしようという環境ならば、必ずJDKがある。だから、JRubyは間違いなくその環境で使えるわけで、そうなるとRakeも使えるようになる。Rakeの適用を一気に優しくするグッドアイデアである。

が、その程度のことで話題になるわけもない。なにかプラスアルファがあるんじゃなかろうか。そう思ってちょっと調べてみたのだが・・・納得した。そうか、JRubyはBSFエンジンを実装しているから、rubyスクリプト内で直接Java APIを呼び出せるのか。Groovyと同じ事ができるわけだな。

試しに、hoge.rbなどというやる気のない名前でこんなスクリプトを書いてみた。

require 'java'

include_class %w(javax.swing.JFrame javax.swing.JLabel)

frame = JFrame.new "Computer"
frame.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE

label = JLabel.new "Serve the Computer! Computer is your Friend!"

frame.getContentPane.add label

frame.pack
frame.show

で、実行してみた。

$ jruby hoge.rb

おー…でてきたよ、JFrame。

こうしたBSFを利用した実装は、内部DSLなRakeでも当然扱える。JRubyを使うことで、可搬性を高めるだけじゃなく、Javaとの親和性を上げることができるというわけだ。

FoemBlogでは、この機能を使って直接com.sun.tools.javac.Mainクラスを呼び出してコンパイルさせている。これ以外にも、例えばJ2EEの世界でよく見られるJava実装のビルドツールを直接呼び出したりすることができるな。なるほど、ビルドがやりやすくなる。しかも、JRubyからクラスを直接使用する、という形でJava製ツールを使うから新たにJVMプロセスを立ち上げなくて済むわけで、普通にRuby+Rakeの組み合わせでjavac呼びまくるよりは軽快に動いてくれるはず。

JRubyにより可搬性とJavaとの親和性が生まれ、ここにRakeの強力な機能が加わる。これだけ揃えばJavaのビルドはバッチリだぜ、複雑なビルドも手軽にエレガントに実装できるぜ、もうAntなんてまどろっこしいもんは使う必要ないぜ、という見方があり、それでJRakeはAnt Killerとまで呼ばれている。

ただ、Antであればタスクとして用意してある機能を、JRakeでは自分で実装しないといけなくなるので、結構面倒かもしれない。一発作れば終わりかもしれんが。

でも、ホントいい組み合わせだと思うよ!実際に自分でビルド環境作ってみないと評価しきれないが、コンセプトはわかった。これは追求したい!