Rails と Java EE の連携 - Goldspike のかわりに Warbler で

Posted by arungupta on April 07, 2008 at 11:49 AM

本ブログの3回連続シリーズ・[ Part 1 |Javaintegration_glassfish_1Ja] では、 Goldspike のプラグイン を使って Java EE のサーブレットと Rails アプリケーションを WAR ファイルにパッケージし、 GlassFish v2 UR1 上に配備する手順を紹介しました。

前回の記事中でも触れたとおり、 Goldspike には若干の問題が残されています。 Warbler を使えば、よりコンパクトで柔軟な、そして Ruby らしいやり方で WAR ファイルを作ることができます。

Warbler はとにかく無駄のない WAR ファイルを作成してくれるんです。たとえば .svn ディレクトリはパッケージングの対象から排除されますし、 test や migration などもちゃんと除外してくれるのですよ。実にすばらしい。

なお、Warbler は現時点ではディスパッチ処理に RailsServlet を使用していますが、これは必要に応じて取り外すことも可能です。今回お送りする Part 2 では、Warbler を使って WAR ファイルを生成する方法を解説します。

Rails powered by GlassFishでは、商用グレードのアプリケーションサーバ・ GlassFish に備わるリッチな機能が余すところなく紹介されています。

それでは、詳しい手順を紹介していきましょう:

1. まず、インストール済みの JRuby 1.1 ( Rails もセットアップされていること)に Warbler の gem をインストールします:

~/testbed/jruby-1.1 >bin/jruby -S gem install warbler
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Updating metadata for 35 gems from http://gems.rubyforge.org
...................................
complete
Successfully installed warbler-0.9.4
1 gem installed
Installing ri documentation for warbler-0.9.4...
Installing RDoc documentation for warbler-0.9.4...

2. "railsee2"という名前でRailsアプリケーションを作成します:

~/testbed/jruby-1.1/samples/rails >../../bin/jruby -S rails railsee2
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      . . .
      create  log/production.log
      create  log/development.log
      create  log/test.log

話を簡単にするために、このアプリケーションではデータベースを使用しないことにします。
"config/environment.rb" の以下の行のコメントアウトをはずしてください(行頭の "#" を削除します):

config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

3. "config" ディレクトリ内に "web.xml" というファイルを新規に作成し、以下のように記述してください。

<!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
        <servlet>
                <servlet-name>HelloServlet</servlet-name>
                <servlet-class>server.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>HelloServlet</servlet-name>
                <url-pattern>/hello</url-pattern>
        </servlet-mapping>
</web-app>

この "web.xml" は Warbler により WAR ファイルにパッケージされます。

4. サーブレットの作成とコピー

 1. この記事 #5 の手順に従ってサーブレットのコードを含むJavaのライブラリを作成します。

 2. "HelloServlet.jar" を NetBeans プロジェクトの "dist" ディレクトリから Rails アプリケーションの "lib" ディレクトリにコピーします。

5. WARの作成と配備

 1. 以下のようにコマンドを実行して WAR ファイルを作成しましょう:

~/testbed/jruby-1.1/samples/rails/railsee2 >~/testbed/jruby-1.1/bin/jruby -S warble
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
jar cf railsee2.war -C tmp/war .

 2. そして、次の手順で WAR ファイルを GlassFish v2 UR2 に配備します:

~/testbed/jruby-1.1/samples/rails/railsee2 >~/testbed/glassfish/v2ur1/glassfish/bin/asadmin deploy railsee2.war 
Command deploy executed successfully.

6. "http://localhost:8080/railsee2/hello" という URL から、 Rails に含めたサーブレットにアクセスしてみましょう。

デフォルトではブラウザに以下のように表示されます:
Cannot resolve external resource into attachment.

URL に "http://localhost:8080/railsee2/hello?name=Arun" のようにパラメータを渡すと、次のように表示が変わります:
Cannot resolve external resource into attachment.

このように、GlassFish v2 UR1 上に配備した Rails アプリケーションを Java EE のサーブレットと連携させることができました。

では、続いて Rails アプリケーションにコントローラとビューを追加し、そこからこのサーブレットを呼び出して Rails との完全な連携を試してみましょう。

7. コントローラとビューは次のように作成します:

~/testbed/jruby-1.1/samples/rails/railsee2 >../../../bin/jruby script/generate controller home index
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/home
      exists  test/functional/
      create  app/controllers/home_controller.rb
      create  test/functional/home_controller_test.rb
      create  app/helpers/home_helper.rb
      create  app/views/home/index.html.erb

8. "app/controllers/home_controller.rb" に作成されたコントローラを次のように変更しましょう:

class HomeController < ApplicationController

include Java

  def index
        url = java.net.URL.new("http://localhost:8080/railsee2/hello");
        conn = url.open_connection;
        reader = java.io.BufferedReader.new(java.io.InputStreamReader.new(conn.get_input_stream));
        @servlet_output = "";
        input_line = reader.read_line;
        while input_line != nil
                @servlet_output << input_line;
                input_line = reader.read_line;
        end
        reader.close;
  end
end

9. そして、 "app/views/home/index.rhtml.erb" に作成されたビューを次のように変更します:

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<%= @servlet_output %>

10. では、上記 # 5 に示す手順で WARファイルを再作成し、 "http://localhost:8080/railsee2/home/index" にアクセスしてみましょう。

次のような画面が表示されましたね:

Cannot resolve external resource into attachment.

このブログエントリでは、 Warbler を使って JavaEE5 のサーブレットと Rails アプリケーションをパッケージングし、 GlassFish 上に配備する手順について解説しました。

Warbler の詳しい使い方、および設定方法や web.xlm などについての詳細は、 Warbler のドキュメントにて紹介されています。

本 3 回シリーズの次のエントリでは、同じようなアプリケーションを GlassFish v3 上に配備する方法を紹介します。 GlassFish v3 のすごいところは、 Goldspike や Warbler 、あるいはその他のプラグインなどは一切必要とせず、それ単体で配備が完了するという点です。続きをお楽しみに!


日本語翻訳: Kana

原文