[JRuby on Rails on GAE/J] rubygems を jar ファイルの中にまとめる

» Posted by on 12月 1, 2009 in Blog | 0 comments

GAE/J で Rails アプリを開発するとき、GAE/J 上にアップロードできるファイル数の制限の関係から、
なんとかしてファイル数を減らしたくなります。
そこで、有効なのが、使用する rubygems を jar ファイルの中にまとめてしまうこと。

JRuby から jar ファイル内の rubygems を読み込むにはちょっと苦労するのですが、
JRuby on Rails on GAE/J では、簡単に読み込むことができます。

  • JRuby on Rails on GAE/J では、RAILS_ROOT/vendor/gems にある rubygems require “gem-name” すればロードできる
  • ただ、vendor/gems に直接放り込むとファイル数がかさんで、アップロード可能なファイル数の制限に引っかかることがある
  • JRuby on Rails on GAE/J では、jar 内にある rubygems もロードできる
  • jar ファイルに、rubygems をまとめればいい

手順

  • gem を指定したディレクトリにインストール
    • -i オプションを使い、一時ディレクトリにインストール
    • –no-rdoc, –no-ri オプションを使い、不要な rdoc, ri をインストールしないことで容量を節約
  • jar コマンドで一時ディレクトリにある gem を jar ファイルにまとめる
  • RAILS_ROOT/config/environment.rb に require “installed-gem.jar” を追加する

以下、scrapi を jar ファイル内にまとめて使えるようにする例

% cd RAILS_ROOT
% cd lib/
% jgem search -r scrapi

*** REMOTE GEMS ***

assaf-scrapi (1.2.1)
scrapi (1.2.0)
scrapin-a-livin (0.1.1)
% jgem install -i scrapi-tmp scrapi --no-rdoc --no-ri
Successfully installed tidy-1.1.2
Successfully installed scrapi-1.2.0
2 gems installed
% cd scrapi-tmp/
% ls
cache  doc  gems  specifications
% ls gems/
scrapi-1.2.0  tidy-1.1.2
% ls specifications/
scrapi-1.2.0.gemspec  tidy-1.1.2.gemspec
% jar cf ../scrapi-1.2.0.jar gems/ specifications/
% cd ..
% ls
...  scrapi-1.2.0.jar  ...
% rm -rf scrapi-tmp/
% cd ..

以下を config/environment.rb に追加

require 'lib/scrapi-1.2.0.jar'

ただ、dev_appserver.sh や、appspot.com 上ではこれで rubygems が読み込まれるのですが、
jruby -S で実行した場合、rubygems はロードされないので注意。

普通の、jruby でこの jar ファイル内の scrapi を読み込むには以下の方法しか思いつきませんでした・・・。

require "file:///path/to/rubygems/scrapi-1.2.0.jar!gems/scrapi-1.2.0/lib/scrapi"

もっと、いい方法がありそう。