Rails と Java EE の連携- 生の Rails を GlassFish v3 に配備

Posted by arungupta on April 14, 2008 at 08:18 AM | Comments (0)

本ブログ3回連続シリーズ(Part 1Part 2)・最終回の今回は、 GoldspikeWarbler 、あるいはその他特別な gem やプラグインなどを一切使わず、Rails アプリケーションを GlassFish v3 上に配備する方法をご紹介します。

b09はここからダウンロードしてください

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

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

1. JRuby 1.1 ( Rails もセットアップされていること) を使って次のように Rails アプリケーション "railsee3" を作成します:

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

2. Serblet ディスクリプタを追加

  1. Railsアプリケーションのルートディレクトリ内に "WEB-INF" ディレクトリを作成し、 以下の内容で "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>

  2. 続いて、 "WEB-INF" の中に以下の内容で "sun-web.xml" を作成してください:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software
/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
  <context-root>/servlet</context-root>
  <class-loader delegate="true"/>
</sun-web-app>

  3. さらに "WEB-INF/lib" ディレクトリを新規に作成します。

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

  1. この記事の #5 を参考に Java サーブレットを含むライブラリを作成してください。

  2. NetBeans プロジェクトの "dist" ディレクトリにある "HelloServlet.jar" を "WEB-INF/lib" ディレクトリにコピーしましょう。

4. GlassFish 上の JRuby-on-Rails を設定 - GlassFish ディレクトリ配下の "config/asenv.conf" を開き、ファイルの末尾に以下のように JRUBY_HOME の設定を追加してください。

JRUBY_HOME="/Users/arungupta/testbed/jruby-1.1"

5. 次のようにして Rails アプリケーションを配備します:

~/testbed/jruby-1.1/samples/rails >~/testbed/glassfish/v3/p2b9/glassfish/bin/asadmin deploy --force=true railsee3
railsee3 deployed successfully
Command deploy executed successfully.

6. これで"http://localhost:8080/servlet/hello"というURLから、Railsに含めたサーブレットにアクセスできます。デフォルトでは、ブラウザに以下のように表示されます:
Cannot resolve external resource into attachment.

URLに "http://localhost:8080/railsee3/hello?name=Arun"のようにパラメータを渡すと、次のように表示が変わりますね:

Cannot resolve external resource into attachment.

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

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

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

~/testbed/jruby-1.1/samples/rails/railsee3 >../../../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/servlet/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 %>

では、上記 # 5 に示す手順で Rails アプリケーションを再配備し、"http://localhost:8080/railsee3/home/index"にアクセスしてみましょう。次のような画面が表示されましたか?:

Cannot resolve external resource into attachment.

このブログエントリでは、Warbler のような gem や Goldspike のようなプラグインを使うことなく、 GlassFish v3 上に Rails アプリケーションを配備する方法を解説しました。

Warblerを使ってJavaEE5のサーブレットとRailsアプリケーションをパッケージングし、GlassFish上に配備する手順について解説しました。完全にネイティブな配備です!

以上、この3回連続シリーズでは GlassFish 上への Rails アプリケーションの配備モデルについてお話してきました。いずれのモデルでも Java EE のサーブレットを Rails アプリケーションに同梱し、Rails のビューから呼び出す方法をご紹介しています。

Part 1 - Goldspikeを用いた GlassFish v2 UR1 上への配備(WARベース)

Part 2 - Warblerを用いた GlassFish v2 UR1 上への配備(WARベース)

Part 3 - gem やプラグインを使用しない、GlassFish v3 上へのネイティブな配備


日本語翻訳: Kana

原文