2008/01/03

JRuby1.1 on Rails

JRuby1.1とGlassFishでJRuby on Railsをやってみた。

Rubyの最新版をビルド

  1. NetBeans 6.0(Full)をダウンロード
  2. Versioning -> Subversion -> Check outを選択。
  3. Repository URLにhttp://svn.codehaus.org/jruby/trunk/jrubyを入力する。User、Passwordは空欄でOKでチェックアウト。
  4. OpenProjectするか聞かれたらするほうで。
  5. ProjectsにJRuby trunkが追加される。
  6. build.xmlのjarターゲットを実行

これでビルドされる。cmdでPATHを通して

>jruby -v Ruby 1.8.5 (2008-01-03 rev 5128) [x86-jruby1.1b1]

JRuby設定

  1. Tools -> Optionsで設定画面を開き、Rubyタブを選択。
  2. Ruby Interpreterに先ほどチェックアウトしたJRubyのbin\jruby.batを指定してOKボタン
  3. Tools -> Ruby Gemsを選択する。
  4. 以下のGemを追加
    • rails
    • ActiveRecord-JDBC
    • activerecord-jdbc-adapter
    • activerecord-jdbcmysql-adapter

ActiveRecord-JDBC周りはmysqlでJDBCを使わない場合はいらないらしい。

サンプルプロジェクト作成

今回はRails2.0.2のテストとしてこれを作ってみた。

  1. Projectsを右クリックしてNew Project
  2. Ruby -> Ruby on Rails Application
  3. 以下を設定。
    • Project Name: todo
    • Database:mysql
    • Access Database Using JDBC:チェックしない
    • Add Rake Targets to Support App Server Deployment:チェックしない

    最後のチェックを入れるとGoldSpikeというJavaとRoRを連携させるプラグインがインストールされるが、古いとエラーになるみたいなので最新版をあとでチェックアウトする。

    ※後述のWarを作るターゲットでprivate method `makedirs' called for File:Classというエラーがでる

  4. Projectsでtodoプロジェクトを右クリックしてRun Rake Task→db→create→allを選択。

    これでDBが作成される。rootのパスワードが設定されている場合は先に、database.ymlのコンフィグをやっておく。

  5. Projectsでtodoプロジェクトを右クリックしてGenerateを選択
  6. 以下を設定してOK
    • Genereate:scaffold
    • Model:Todo title:string body:text done:boolean due:datetime
  7. Projectsでtodoプロジェクトを右クリックしてMigrate Database→To Current Versionを選択。
  8. Projectsでtodoプロジェクトを右クリックしてrunを実行する。Webricでとりあえず動くかを確認する。

GlassFishへのデプロイ

いよいよWarにしてGlassFishに配置する。

まずはJavaEE-RoRの連携プラグインであるGoldSpikeをインストールする。

  1. コマンドプロンプトでこのプロジェクトディレクトリに移動。
  2. jruby script\plugin install http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike/

    Revision 862以上ならばバグが修正されている。
  3. 動作確認のため以下のコマンドを実行する。

    jruby -S rake -T ・・・ rake war:standalone:assemble # Assemble the files for a standalone ... rake war:standalone:create # Create a self-contained Java war rake war:standalone:run # Run the webapp in Jetty

    というwarを作成するTaskがあればOK

  4. config/war.rbというファイルが追加されているので、maven_library 'mysql', 'mysql-connector-java', '5.0.4'のコメントをはずす。
  5. controller/application.rbにある

    protect_from_forgery #:secret => '043d72660fe6fea5e591c289d7751eae'

    の#でコメントされている部分から#をはずし、'043d72660fe6fea5e591c289d7751eae'の中身を変更する。

    これはRails2から導入されたCSRF対策用の設定。secretの設定値はランダム値がいいらしい。これをやっていないとNewリンクをクリックしたときにActionController::InvalidAuthenticityToken in Todos#newというエラーがでる。

  6. Projectsでtodoプロジェクトを右クリックしてRun rake task -> war -> standalone -> createを選択する。
  7. しばらくほうっておくとプロジェクトディレクトリ直下にtodo.warが生成される
  8. Production環境で実行されるので以下のコマンドでDBにmigrateしておく。

    jruby -S rake db:migrate RAILS_ENV=production

  9. Servicesタブを選択する。ServersからGlassFishを右クリックしてStartをする。
  10. ServersからGlassFishを右クリックしてView Adminconsoleを選択する。
  11. AdminCosoleがブラウザで開くのでログインする。
  12. Deploy Web Applicationを押す。
  13. Locationに生成したWarを指定してOKを押す。
  14. http://localhost:8080/todo/todosにアクセスする。

これでアクセスできるはず。

GlassFishに載せてしまうと通常のRailsのようにはファイルが簡単に更新できなくなるので手元でWebricとかで開発して運用はGlassFishみたいな使い分けが必要だなぁ。

0 件のコメント: