かなりすごいブログ

RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり!

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などのプラグインに対応していないので、その点だけが残念です。

JRuby+JavaFXサンプル

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というゲームにあります。今度、詳細を記事にしたいと思います。