RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり!
2013年08月10日Ruby大好きな私としては、一般配布するGUIアプリケーションとかもRubyで書きたい訳です。しかし、Windowsには標準でRubyは入っていないし、Macもバージョンが古い1.8.7が標準だしで、普段プログラミングなんかしない一般ユーザーさんでも簡単に起動できるアプリケーションを作るのがなかなか難しいという問題があります。
そういった問題から、クロスプラットフォームな言語・ライブラリ、例えばC++のQtなんかに一時期浮気したりもしたのですが、やっぱりRubyで書きたい。だってRubyが好きだから。
そして、色々調べまくった結果、はい、ついに「これだ!」と思えるRubyによるGUIアプリケーション開発環境を揃えることができました。それは…
- JRuby
- JavaFX
- jrubyfx
- Rawr
この組み合わせです…!それぞれ解説していきましょう。
JRuby … JavaでRuby!
JRubyは、簡単に言えばJVMで動くRubyです。つまり、Javaがインストールされている環境で普通に動きます。Windowsには標準でJavaが入っている(8月11日追記:そんなことはありませんでした><) ので、JRubyで作成したアプリケーションをjarファイルとしてパッケージングし配布すれば、ユーザーさんはそのjarファイルをダブルクリックするだけでアプリケーションが使えてしまうという訳です。
JRuby自体の完成度も高く、プリミティブ型へのキャストなどで若干罠はあるものの、概ねJavaの顔が覗かせることなく素のRubyと同じ様にプログラミング可能です。またなんといっても、Ruby on Railsアプリケーションのコードに一切変更を加えることなく動かせるという事を目標に開発されているくらい、互換性が高いです。時代はJRuby。
JavaFX … なんかいいかんじにGUI!
GUI。GUIをやりたいんです。swingとかawtとかSWTとか色々ありますが、私はJavaFXを推します。JavaFX、色々すごいのですが、なによりWebViewが使えるのです!専用ブラウザとかを作ることが多い私にとって、これはすごく大きい。ただし、FlashPlayerなどのプラグインに対応していないので、その点だけが残念です。
JavaFXは、最新のJDKをインストールすれば標準で付いてきます。
jrubyfx … JavaFXをRubyishに!
jrubyfxは、JavaFXをJRubyからRubyishに書けるようにするためのラッパーライブラリです。なので、これを使用せずともJavaFXなJRubyアプリケーションを書くこと自体は可能ですが、jrubyfxを導入することによって、かなりRubyishにGUIアプリケーションを作成することができるようになります。
require 'java' require 'jrubyfx' class App < JRubyFX::Application def start(stage) with(stage, width: 800, height: 600, title: 'Hello JRubyFX') do layout_scene do web_view do |v| v.engine.load "http://google.com/" end end show end end end App.launch
たったこれだけのコードで、上記スクリーンショットの様な簡易ブラウザが完成してしまいます。すごいよjrubyfx。
Rawr … 配布用にパッケージング!
Rawrを使えば、作成したjrubyアプリケーションを簡単にjarへとパッケージングすることができます。Rawrのすごいところはそれだけでなく、なんとWindowsやMac OS Xのアプリケーション形式、つまり.exeや.appといったファイルとしてラッピングもできるのです。一般のPCユーザーは「アプリケーション=.exe形式」という認識でしょうし、「.jar?なにそれ?」という方が殆どでしょう。.exe形式で配布できるのはとてもうれしいですね。しかも、.exeファイルをコンパイルしているわけではないので(実は設定ファイルを読み込んでjarを実行するexeファイルを配置してくれているだけ)、Mac OS Xで.exeパッケージを作成することができます。マカーだけどWindowsユーザーも使えるアプリケーションを作りたい、といった場合に便利ですね。まさに私がそのパターンです。
実際に作ってみよう
というわけで、JRuby+JavaFX+jrubyfx+Rawrが最強!というご紹介でした。それでは実際にサンプルのブラウザアプリケーションを作ってみましょう。
JRubyのインストール
まずJRubyが入ってない人はインストールします、Mac OS Xなら
brew install jruby
で一発です。簡単ですね。
Windowsの場合も簡単です。まずWindowsPCを友人に譲り、その後MacBook Airを購入し、homebrewを導入することで上記コマンドでインストールできるようになります。
JDKのインストール
オラクルのサイトからJDK7をダウンロードし、インストールしましょう。
jrubyfxのインストール
jrubyfxはrubygemですので、以下のコマンドでインストールできます。
jruby -S gem install jrubyfx
Rawrのインストール
同様に、Rawrもインストールしましょう。Rawrはソース元を指定する必要があります。
jruby -S gem install rawr --source http://gems.neurogami.com
Rawrプロジェクトの作成
これで準備は整いました。それでは、Rawrプロジェクトを作成していきましょう。まずはプロジェクト用にフォルダを作成します。ここではsimple_browser
とします。その後、simple_browser
フォルダに移動します。
mkdir simple_browser
cd ./simple_browser
rawrコマンドでrawrプロジェクトのセットアップを行います。これで、必要なファイル一式がrawrによって自動で配置されます。
jruby -S rawr install
依存gemの追加と設定
次に、依存gemの設定を行います。残念ながらRawrはGemfileなどを考慮してくれませんので、自分でgemのファイルを配置する必要があります。./lib/ruby
フォルダを作成し、そちらにインストールしましょう。
mkdir ./lib/ruby
jruby -S gem install -i ./lib/ruby jrubyfx jrubyfx-fxmlloader --no-rdoc --no-ri
その後、パッケージング時に./lib/ruby
の各ファイルを読みこんでくれるように、設定ファイルを編集します。おもむろにVimを起動し、./build_configuration.rb
を編集しましょう。20〜30行目付近にあるコメントを参考に、c.source_dirs
に”src”だけでなく”lib/ruby”も追加してみます。
# A list of directories where source files reside # default value: ["src"] # c.source_dirs = ["src", "lib/ruby"]
これでプロジェクトの設定は完了です!
アプリケーションコードの作成
さて、いよいよアプリケーションのコードを作成します。Vimで./src/main.rb
を作成し、以下のコードをペースト・保存してみましょう。
require 'java' require 'jrubyfx' class App < JRubyFX::Application def start(stage) with(stage, width: 800, height: 600, title: 'Hello JRubyFX') do layout_scene do web_view do |v| v.engine.load "http://google.com/" end end show end end end App.launch
パッケージング
最後にパッケージングです。
jruby -S rake rawr:jar
を実行すると、ディレクトリ./package/jar
と、その中にsimple_browser.jar
が作成されます。java
コマンドで、jarファイルを実行してみましょう。
java -jar ./package/jar/simple_browser.jar
無事ブラウザ画面が表示されたら成功です!お疲れ様でした。
Windows用にパッケージング
さきほどはjarファイルとしてパッケージングしましたが、もちろんexe化も可能です。
jruby -S rake rawr:bundle:exe
を実行しましょう。ディレクトリ./package/windows
と、その中にsimple_browser.exe
が作成されます。配布時は、.exeファイルだけでなく、windows
フォルダ内のファイルすべてを同梱する必要があります。適当にzipとかに固めて配布しましょう。
その他のコマンドやパッケージングコマンドは、jruby -S rake -T
コマンドで確認できます。
rake rawr:base_jar # Create a base jar file rake rawr:build_extra_jars # Build all additional user jars rake rawr:bundle:app # Bundles the jar from rawr:jar into a native Mac OS X application (.app) rake rawr:bundle:exe # Bundles the jar from rawr:jar into a native Windows application (.exe) rake rawr:clean # Removes generated content rake rawr:compile # Compiles all the Java source, Mirah source, and Ruby source files in the source_dirs entry in the build_configuration.rb file rake rawr:compile_duby_classes # Compiles the Duby source files specified in the source_dirs entry rake rawr:compile_java_classes # Compiles the Java source files specified in the source_dirs entry rake rawr:compile_mirah_classes # Compiles the Mirah source files specified in the source_dirs entry rake rawr:compile_ruby_classes # Compiles the Ruby source files specified in the source_dirs entry rake rawr:get:current-jruby # Fetch the most recent build of jruby-complete.jar rake rawr:get:current-stable-jruby # Fetch the most recent stable jruby-complete.jar rake rawr:jar # Uses compiled output and creates an executable jar file
まとめ
いかがでしたか?みなさんもぜひJRubyを使ってみてください。
ちなみにJRuby上達の秘訣はMinecraftというゲームにあります。今度、詳細を記事にしたいと思います。