JRubyCompleteを使ったデスクトップアプリケーションの作成

[ PR ]
久しぶりのブログです。長く間が空いてしまってすみません。
さて、今回はJRubyでデスクトップアプリケーションを作る方法を取り上げます。
JRubyで作るデスクトップアプリケーション
あなたは、「Rubyでデスクトップアプリケーションを作る」ことを考えると、どうやって作りますか?
方法はいくつかありますが、配布などを考えると、一番に思いつくのはJRubyを使う方法じゃないでしょうか。
例えばJarファイルで配布できれば、単体でも実行できる上に、Windowsならexeファイル、Macならappファイルに変換することも簡単です。
そこで、今回はjruby-complete.jarというJarファイルを使って、実行可能Jarファイルとしてアプリケーションを作成する方法を紹介します。
jruby-complete.jar
今回は、jruby-complete.jarというJRuby本体 + 標準ライブラリが丸々一つのファイルになっているJarファイルを使います。http://www.jruby.org/download からダウンロードできます。
jruby-completeは、JRubyそのものなので、
java -jar jruby-complete.jar -e "puts 'hello, jruby!'"
# hello, jruby!
といった使い方ができます。これだけでも十分便利ですね。
エントリポイントを作成
jruby-completeは、jar
コマンドを使って以下のようにエントリポイントを作れば、実行可能Jarファイルとして使えるようになります。
## jruby-completeをコピー
cp jruby-complete.jar myapp.jar
## jar-bootstrap.rbというファイルを作成
echo "puts 'hello, jruby!'" > jar-bootstrap.rb
## エントリポイントを書き込み
jar ufe myapp.jar org.jruby.JarBootstrapMain jar-bootstrap.rb
## 実行してみる
java -jar myapp.jar
# hello, jruby!
この方法を使ってスタンドアローンアプリを作ります。
ソースコードの書き込み
今度は、複数のファイルを書き込みしてみましょう。以下の2つのファイルを準備します。
# jar-bootstrap.rb
require "./hello.rb"
hello()
# hello.rb
def hello()
puts "hello!"
end
上記2つのファイルを、以下のようにして書き込みます。
cp jruby-complete.jar myapp.jar
jar uf myapp.jar hello.rb
jar ufe myapp.jar org.jruby.JarBootstrapMain jar-bootstrap.rb
実行してみましょう。
java -jar myapp.jar
# hello!
実行は出来ました。ただ、一つ一つ書き込むのは面倒ですね。
例えば、ソースがsrc
というフォルダに全て入っているとすれば、
jar uf myapp.jar -C src .
これでsrc内の全てのファイル(フォルダ含む)が書き込まれます。これなら楽ですね。
RubyGemsの扱い
実は、RubyGemsもソースコードと同じ方法で書き込めます。
まずgemをまとめるフォルダを「gems」とします。そこにgemをインストールするには以下のようにします(例ではnokogiriをインストール)。
mkdir gems # 初回のみ
java -jar jruby-complete.jar -S jgem install nokogiri -i gems (※)
(※)
(※)のコマンドはjrubyのissues#1218で議論されているように上手く動作しない場合があるので、その場合は別にJRubyをインストールして、
jgem install nokogiri -i gems
でOKです。
すると、gemsフォルダにgemが入っているので、
jar uf myapp.jar -C gem .
とするとgemsが使えるようになります。
まとめ:Rakefileを作る
さて、以上の方法でスタンドアローンアプリが作れます。
実際には、開発ではjruby-completeを単にJRubyとして使って、デプロイでJarファイルを作るのが便利です。
そのようなタスクをRakefileにまとめてみました。
JRUBY_COMPLETE = "/path/to/jruby-complete-1.7.14.jar"
JRUBY = "java -Xmx500m -Xss1024k -jar #{JRUBY_COMPLETE}"
APP_NAME = "myapp"
SOURCES = FileList.new("src/**/*.rb")
ENTRY_FILE = "jar-bootstrap.rb"
COLOR = "\033[33m"
RESET = "\033[39m"
def log(s)
puts COLOR + "--- " + s + RESET
end
task :default => [:run]
task :run do
sh "export GEM_PATH=gem; #{JRUBY} -Csrc #{ENTRY_FILE}"
end
task :deploy do
log "clean"
sh "rm -rf dist/*"
log "duplicate jar"
sh "cp #{JRUBY_COMPLETE} dist/#{APP_NAME}.jar"
log "write gems"
sh "jar uf dist/#{APP_NAME}.jar -C gem ."
log "write sources"
sh "jar uf dist/#{APP_NAME}.jar -C src ."
log "set entry point"
sh "jar ufe dist/#{APP_NAME}.jar org.jruby.JarBootstrapMain src/jar-bootstrap.rb"
log "clean up"
sh "rm -rf dist/*.tmp"
end
task :init do
mkdir src gem dist
end
task :clean do
sh "rm -rf dist/*"
end
rake init
とすると、src、gem、distの3つのフォルダが作られます。
ソースコードはsrcフォルダにまとめ、gemはjgem install xxx -i gems
としてgemフォルダにまとめます。
実行はrake run
、デプロイはrake deploy
です。Jarはdistフォルダに作られます。
このRakefileに今まで説明したものがまとめてあるので、是非使ってみてください。