[Ubuntu][JRuby][Rails][MySQL][BackgrounDRb] インストールメモ

現在のプロジェクトのRailsアプリから,Javaでしか安定して利用できなさそうな機能を使うことになったので,まず手元のUbuntuマシンにJRubyインストールしてみた.というメモです.

Javaのバージョンを確認して

$ java -version
java version "1.6.0"

JRubyのサイトからファイルをダウンロード

$ wget  http://dist.codehaus.org/jruby/jruby-bin-1.0.1.tar.gz
$ tar zxf jruby-bin-1.0.1.tar.gz

して,サンプルが動くことを確認

$ cd jruby-1.0.1
$ ./bin/jruby samples/javascript.rb  # JavaScriptJava上でのeval via JRuby
Hello, multilanguage world

したら,適当なディレクトリに放りこみ,

$ cd ..
$ sudo mv jruby-1.0.1 /usr/local/share/
$ sudo chown -R root:root /usr/local/share/jruby-1.0.1

.bashrc/.zshrcなどで環境変数をセットすると

export $JRUBY_HOME=/usr/local/share/jruby-1.0.1
export PATH=$PATH:$JRUBY_HOME/bin

jrubyコマンドが使えるようになる.

$ jruby -version
ruby 1.8.5 (2007-08-23 rev 4201) [i386-jruby1.0.1]

gemパッケージのインストール

試しにrakeをインストール.

$ sudo $JRUBY_HOME/bin/jruby -S gem install rake

このとき下のようにメモリがたりなくなる場合は

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

JVMのオプションを追加してメモリ512Mにする(参考).

$ sudo $JRUBY_HOME/bin/jruby -J-Xmx512m -S gem install rake

うまくいったらrailsをインストール.

$ sudo $JRUBY_HOME/bin/jruby -S gem install rails -y --no-ri --no-rdoc

以下は今のrailsプロジェクトで使ってるパッケージのインストール

$ sudo $JRUBY_HOME/bin/jruby -S gem install acts_as_searchable
$ sudo $JRUBY_HOME/bin/jruby -S gem install has_many_polymorphs

JRubyMySQLを使えるようにする

MySQLJDBCドライバはMySQL :: Download Connector/JにあるけどUbuntuのパッケージにlibmysql-javaとしてあったのでインストールし,

$ sudo apt-get install libmysql-java
$ ls /usr/share/java/mysql.jar  # mysql.jarのインストール場所確認

クラスパスの設定を.bashrc/.zshrcなどに追加.

export CLASSPATH=$CLASSPATH:/usr/share/java/mysql.jar

=begin 2008-03-23修正

ActiveRecord-JDBCをインストール

$ sudo $JRUBY_HOME/bin/jruby -S gem install ActiveRecord-JDBC

して,JRuby版のirbでロードの確認.

$ jirb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> gem 'ActiveRecord-JDBC'
=> true
irb(main):003:0> require 'jdbc_adapter'
=> true
irb(main):004:0> require 'active_record'
=> true


サーバ移転時に上記と同じことをするとこちらの記事と同じ問題が発生.
記事に書いてある通りActiveRecord-JDBCをgemからアンインストールし,ActiveRecord-JDBCよりも新しいモジュールであるactiverecord-jdbc-adapterをgemでインストールすると問題なく動いた.
=end 2008-03-23修正

database.ymlのアダプタをJRubyの場合はJDBCを使うように変更

development:
<% if RUBY_PLATFORM =~ /java/ %>
  adapter: jdbc
  driver: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost/myapp_development   # myapp はプロジェクト名
<% else %>
  adapter: mysql
  database: myapp_development   # myapp はプロジェクト名
  encoding: utf8
<% end %>
  #  ... ユーザ名,パスワードなどの設定

#  ...
#  ... test:, production: も同様に
#  ...

=begin 2008-03-23修正

したら,environment.rbの`Rails::Initializer.run do ...`より前に下のコードを追加し,

require 'rubygems'
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'
require 'active_record'


=end 2008-03-23修正

試しにrakeのマイグレーションタスクを実行するとパーミッションで怒られたので

$JRUBY_HOME/bin/rake db:migrate
zsh: permission denied: /usr/local/share/jruby-1.0.1//bin/rake

セットし直すとうまく通った.

$ sudo chmod a+r $JRUBY_HOME/bin/*
$JRUBY_HOME/bin/rake db:migrate

最後にWebrickサーバも起動してみる.

$ jruby script/server

gettextが動かない

gettextのgemをJRubyにインストールしようとしたけど,JRuby版が見付からず,無理だった.

$ sudo su -
# jruby -S gem install gettext
 1. gettext 1.10.0 (mswin32)
 2. gettext 1.10.0 (ruby)
 3. gettext 1.9.0 (mswin32)
 4. gettext 1.9.0 (ruby)
 ...
> 2
Building native extensions.  This could take a while...
Error opening script file: extconf.rb (No such file or directory)
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

gettext用のコードがそこらじゅうにあるので,都合が悪い.

とりあえずはJavaの機能が必要な部分だけJRuby上でdRubyサーバ化した上で,
メインのWebサーバプロセスはCRubyで動かすなどすればよさそう.

BackgrounDRbがJRubyで動いてくれれば楽そうだけど,まだ怪しい(参考URL).
-- 追記 --> JRUBY-1290でbugfixされたらしく,最新のJRubyのソースからコンパイルしたものを使うと,無事にBackgrounDRbのサーバをJRubyで動かすことができた.

参考: