jettyでJRuby On Railsを動かすメモ その2

jettyでJRuby On Railsを動かすメモJRuby On Railsが動くようになったので次はJDBC接続でscaffoldを動かしてみる。データベースはapache derbyを組み込みモードで使うことにしてみる。

derbyのインストール

  • ここからdb-derby-10.2.2.0-bin.zipをダウンロードして、C:\derbyに解凍

テスト用データベースの作成

モデルの作成
migrationファイルを作成するために以下を実行
C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>jruby script/generate model Programmer
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/programmer.rb
      create  test/unit/programmer_test.rb
      create  test/fixtures/programmers.yml
      exists  db/migrate
      create  db/migrate/001_create_programmers.rb

生成されたdb/migrate/001_create_programmers.rbを以下のように修正してカラムを追加

class CreateProgrammers < ActiveRecord::Migration
  def self.up
    create_table :programmers do |t|
      t.column "name", :string, :limit => 255, :null => false
    end
  end

  def self.down
    drop_table :programmers
  end
end
web.xml及びconfig\database.ymlを修正

web.xmlで以下のようになっており、デフォルト動作モードはproductionなので以下のように修正

<context-param>
  <param-name>rails.env</param-name>
  <param-value>development</param-value>
</context-param>

そしてdatabase.ymlを以下のように修正

development:
  adapter: jdbc
  driver: org.apache.derby.jdbc.EmbeddedDriver
  url: jdbc:derby:/derby/databases/dev;create=true

config/environment.rbを修正

require File.join(File.dirname(__FILE__), 'boot') の下に以下を追加(jdbc用設定らしい)

require 'rubygems'
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'
migrateの実行
C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>jruby -S rake db:migrate

(in C:/Docs/Eclipse/Workspaces/demos/simple/src/main/webapp)
rake aborted!
The driver encountered an error: cannot load Java class org.apache.derby.jdbc.EmbeddedDriver

(See full trace by running task with --trace)

む…エラーが…ってJDBCドライバにクラスパス通ってないからか。というわけで以下を実行

C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>set CLASSPATH=%CLASSPATH%;C:\derby\db-derby-10.2.2.0-bin\lib\derby.jar

以下でクラスパスが通ったことを確認

C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>echo %CLASSPATH%
C:\Program Files\Java\jre1.5.0_05\lib\ext\QTJava.zip;;C:\derby\db-derby-10.2.2.0-bin\lib\derby.jar

再度実行

C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>jruby -S rake db:migrate

(in C:/Docs/Eclipse/Workspaces/demos/simple/src/main/webapp)
== CreateProgrammers: migrating ===============================================
-- create_table(:programmers)
   -> 0.3280s
== CreateProgrammers: migrated (0.3280s) ======================================

で成功した。

scaffold実行

C:\Docs\Eclipse\Workspaces\demos\simple\src\main\webapp>jruby script/generate scaffold Programmer

で特に問題なく成功

pomにjruby on railsに必須のjar及びderbyのjdbcドライバのためのjar設定を追加

warを作成した時にWEB/lib以下に含まれていた以下のjar

activation-1.1.jar
bcprov-jdk14-124.jar
commons-pool-1.3.jar
jruby-complete-0.9.9.jar
rails-integration-1.1.1.jar

及びderbyのjarの設定をjettyでJRuby On Railsを動かすメモで作成したpomに追記

    <!-- for jruby on rails start-->
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1</version>
    </dependency>
    <dependency>
      <groupId>bouncycastle</groupId>
      <artifactId>bcprov-jdk14</artifactId>
      <version>124</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.3</version>
    </dependency>
    <dependency>
      <groupId>org.jruby</groupId>
      <artifactId>jruby-complete</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>org.jruby.extras</groupId>
      <artifactId>rails-integration</artifactId>
      <version>1.1.1</version>
    </dependency>
    <!-- for jruby on rails end-->
    <!-- for apache derby start-->
    <dependency>
      <groupId>org.apache.derby</groupId>
      <artifactId>derby</artifactId>
      <version>10.2.2.0</version>
    </dependency>
    <!-- for apache derby end -->

動かしてみる

C:\Docs\Eclipse\Workspaces\demos\simple>mvn jetty:run

で起動したら、

http://localhost:8080/simple/programmers/list

にアクセスして無事動作した。日本語も問題ない模様。

ただ、OutOfMemoryErrorが発生してる…んーなぜだろう…とりあえず今日はここまで。