Railsで作ったアプリケーションをJRubyで動かすときの覚え書きです。
RailsのアプリをそのままJRubyで動かす
テストケースを動かすとエラーになりました。
$ jruby -S rake test:units (in /home/ksaito/svn/rails/app/trunk) rake aborted! can't convert nil into String (See full trace by running task with --trace) $
下記情報を参考にmysqlへのアクセスの設定でhostとportを設定すると解決できました。
http://d.hatena.ne.jp/niraikanaibird/20070513
Index: config/database.yml =================================================================== --- config/database.yml (リビジョン 160) +++ config/database.yml (作業コピー) @@ -16,6 +16,8 @@ database: app_development username: root password: + host: localhost + port: 3306 socket: /var/run/mysqld/mysqld.sock # Warning: The database defined as 'test' will be erased and @@ -26,6 +28,8 @@ database: app_test username: root password: + host: localhost + port: 3306 socket: /var/run/mysqld/mysqld.sock production: @@ -33,4 +37,6 @@ database: app_production username: root password: + host: localhost + port: 3306 socket: /var/run/mysqld/mysqld.sock $ jruby -S rake test:units (in /home/ksaito/svn/rails/app/trunk) /usr/local/root/jruby-1.0/bin/jruby -Ilib:test "/var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" "test/unit/contact_test.rb" Loaded suite /var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader Started .... Finished in 0.432 seconds. 4 tests, 6 assertions, 0 failures, 0 errors $
mysqlもJDBC経由のアクセスに設定変更する
JRubyで動かすのでmysqlでもJDBC経由でアクセスしてみました。
ActiveRecord-JDBC用に設定変更するには、下記のURLの通りに設定変更します。
http://jruby-extras.rubyforge.org/ActiveRecord-JDBC/
mysqlのJDBCドライバをインストール
JDBCドライバのインストールが必要です。
Debian or Ubuntuであればaptを使ってインストール
$ sudo apt-get install libmysql-java
CLASSPATHの設定は下記のようにすると全ユーザでシェアできます。
$ grep mysql /etc/bash.bashrc # mysql for java export CLASSPATH=/usr/share/java/mysql-connector-java.jar:$CLASSPATH $
config/environment.rbの設定
こんな感じで修正します。
=================================================================== --- config/environment.rb (リビジョン 162)+++ config/environment.rb (作業コピー) @@ -10,6 +10,10 @@ # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') +require 'rubygems' +gem 'ActiveRecord-JDBC' +require 'jdbc_adapter' + Rails::Initializer.run do |config| # Settings in config/environments/* take precedence over those specified here
接続情報の変更
こちらも修正します。
Index: config/database.yml =================================================================== --- config/database.yml (リビジョン 162) +++ config/database.yml (作業コピー) @@ -12,25 +12,24 @@ # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.0/en/old-client.html development: - adapter: mysql - database: app_development + adapter: jdbc username: root password: - socket: /var/run/mysqld/mysqld.sock + driver: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/app_development # Warning: The database defined as 'test' will be erased and # re-generated from your development database when you run 'rake'. # Do not set this db to the same as development or production. test: - adapter: mysql - database: app_test + adapter: jdbc username: root password: - socket: /var/run/mysqld/mysqld.sock + driver: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/app_test production: - adapter: mysql - database: app_production + adapter: jdbc username: root password: - socket: /var/run/mysqld/mysqld.sock + driver: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/app_production
AR-JDBC用のタスクをコピー
テストケースを実行すると失敗します。
$ jruby -S rake test:units (in /home/ksaito/svn/rails/app/brunches/APP_1_DERBY) rake aborted! Task not supported by 'jdbc' (See full trace by running task with --trace)
下記の情報を参考にAR-JDBCからAR-JDBC用のタスクをコピーすると動きました。
http://d.hatena.ne.jp/akm/?date=20070911
$ cp /var/lib/gems/1.8/gems/ActiveRecord-JDBC-0.5/lib/tasks/jdbc_databases.rake lib/tasks/ $ jruby -S rake test:units(in /home/ksaito/svn/rails/app/brunches/APP_1_DERBY) /usr/local/root/jruby-1.0/bin/jruby -Ilib:test "/var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" "test/unit/contact_test.rb" Loaded suite /var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader Started .... Finished in 0.9420000000000001 seconds. 4 tests, 6 assertions, 0 failures, 0 errors
ちなみに同じテストケースをRubyで実行した場合は、下記の通りです。
実行時間の差は、Javaの初期化部分かな?
$ rake test:units (in /home/ksaito/svn/rails/app/trunk) /usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/unit/contact_test.rb" Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started .... Finished in 0.082573 seconds. 4 tests, 6 assertions, 0 failures, 0 errors