Posted by arungupta on April 04, 2008 at 08:04 AM
GlassFish
に Rails アプリケーションを配備する 利点
の一つは、 Rails
と Java EE アプリケーションを同一のコンテナ上で連携させられるということでしょう。
スクリーンキャスト#web9
は、 GlassFish への Rails アプリケーションの配備がいかに容易に行えるかをご紹介しています。
このブログでは、JRuby-on-Rails (jRoR) と Java EE の融合について、少し踏み込んで考えてみたいと思います。 jRoRアプリケーション上でJava EE のサーブレットを呼び出す方法について触れ、RailsのViewからとても簡単にサーブレットを呼び出せることを示します。
なお、GlassFishへのjRoRアプリケーションの配備には WAR ベースモード
を利用します。
くわしい手順はこちら:
1. インストール済みの JRuby1.1 RC3
( Rails を含む)に、必要な gem をインストール:
~/testbed/jruby-1.1RC3>bin/jruby -S gem install activerecord-jdbc-adapter JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL Successfully installed activerecord-jdbc-adapter-0.8 1 gem installed Installing ri documentation for activerecord-jdbc-adapter-0.8... Installing RDoc documentation for activerecord-jdbc-adapter-0.8...
2. Rails アプリケーションを作成:
~/testbed/jruby-1.1RC3/samples/rails>../../bin/jruby -S rails railsee1 create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create config/initializers create db create doc create lib create lib/tasks create log create public/images create public/javascripts create public/stylesheets create script/performance create script/process create test/fixtures create test/functional create test/integration create test/mocks/development create test/mocks/test create test/unit create vendor create vendor/plugins create tmp/sessions create tmp/sockets create tmp/cache create tmp/pids create Rakefile create README create app/controllers/application.rb create app/helpers/application_helper.rb create test/test_helper.rb create config/database.yml create config/routes.rb create public/.htaccess create config/initializers/inflections.rb create config/initializers/mime_types.rb create config/boot.rb create config/environment.rb create config/environments/production.rb create config/environments/development.rb create config/environments/test.rb create script/about create script/console create script/destroy create script/generate create script/performance/benchmarker create script/performance/profiler create script/performance/request create script/process/reaper create script/process/spawner create script/process/inspector create script/runner create script/server create script/plugin create public/dispatch.rb create public/dispatch.cgi create public/dispatch.fcgi create public/404.html create public/422.html create public/500.html create public/index.html create public/favicon.ico create public/robots.txt create public/images/rails.png create public/javascripts/prototype.js create public/javascripts/effects.js create public/javascripts/dragdrop.js create public/javascripts/controls.js create public/javascripts/application.js create doc/README_FOR_APP create log/server.log create log/production.log create log/development.log create log/test.log
3. アプリケーションに Goldspike プラグインをインストール:
~/testbed/jruby-1.1RC3/samples/rails/railsee1>../../../bin/jruby script/plugin install svn://rubyforge.org/var/svn/jruby-extras/trunk/rails-integration/plugins/goldspike A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/war_config_test_config.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_java_library.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_maven_library.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_create_war.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/Rakefile A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/init.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/tasks A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/tasks/war.rake A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/util.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/war_config.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/run.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/java_library.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/packer.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/create_war.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/install.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/goldspike_generator.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates/web.xml.erb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates/war.rb A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/README Exported revision 960. existsconfig createconfig/war.rb createWEB-INF createWEB-INF/web.xml.erbパッケージングに Warbler
を使用し、GoldSpike を使ってディスパッチを行う方法もあります。
4. サーブレットのコードを含む Java のライブラリを作成:
![]() |
の "lib"ディレクトリ内にある "javaee.jar"を追加してください。
String name = request.getParameter("name");
if (name == null || name.equals(""))
name = "Duke";
out.println("<h1>Servlet HelloServlet at " + request.getContextPath () + " says Hello " + name + "!</h1>");
5. Railsアプリをサーブレット用に設定
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>server.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6. WARファイルの作成と配備
~/testbed/jruby-1.1RC3/samples/rails/railsee1>../../../bin/jruby -S rake war:standalone:create (in /Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1) info: Assembling web application info: Packing needed Java libraries ... info: adding Java library jruby-complete-1.1RC3 info: adding Java library goldspike-1.6 info: adding Java library activation-1.1 info: adding Java library commons-pool-1.3 info: adding Java library bcprov-jdk14-124 info: Packing needed Ruby gems ... info: adding Ruby gem rails version 2.0.2 info: adding Ruby gem rake version 0.8.1 info: adding Ruby gem activesupport version 2.0.2 info: adding Ruby gem activerecord version 2.0.2 info: adding Ruby gem actionpack version 2.0.2 info: adding Ruby gem actionmailer version 2.0.2 info: adding Ruby gem activeresource version 2.0.2 info: adding Ruby gem activerecord-jdbc-adapter version 0.8 info: Packing needed files ... info: Creating web archive
に配備:
~/testbed/jruby-1.1RC3/samples/rails/railsee1 >~/testbed/glassfish/v2ur1/glassfish/bin/asadmin deploy railsee1.war Command deploy executed successfully.
7. これで、"http://localhost:8080/railsee1/hello" というURLにてサーブレットにアクセスすることができます。 デフォルトの状態ではブラウザに次のように表示されます:
![]() |
ちなみに、 "http://localhost:8080/railsee1/hello?name=Arun" のように URL にパラメータを指定すると次のように表示されます:
![]() |
さて、これで GlassFish v2 UR1 上の Rails アプリケーションに Java EE のサーブレットが追加されました。 今度はRailsアプリケーションにコントローラとビューを追加して、そこからサーブレットを呼び出してみましょう。
まさに Rails と Java EE の完全なる統合です。
8. 以下のように新規コントローラとビューを作成します:
~/testbed/jruby-1.1RC3/samples/rails/railsee1> ../../../bin/jrubyscript/generate controller home index JRuby limited openssl loaded. gem install jruby-openssl for full support. http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL existsapp/controllers/ existsapp/helpers/ createapp/views/home existstest/functional/ createapp/controllers/home_controller.rb createtest/functional/home_controller_test.rb createapp/helpers/home_helper.rb createapp/views/home/index.html.erb
9. 作成されたコントローラ( "app/controllers/home_controller.rb" )を次のように変更:
class HomeController < ApplicationController
include Java
def index
url = java.net.URL.new("http://localhost:8080/railsee1/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
10. 作成されたビュー( "app/views/home/index.rhtml.erb" )を次のように変更:
<h1>Home#index</h1> <p>Find me in app/views/home/index.html.erb</p> <%= @servlet_output %>
11. 上記 # 6 の手順に従って WAR ファイルを再作成 & 再配備。 "http://localhost:8080/railsee1/home/index" にアクセスすると、以下のような画面が表示されます:
![]() |
以上、 GlassFish 上に配備した Rails アプリケーション から Java EE 5 サーブレットを呼び出す手順をご紹介しました。 JRuby-on-Rails と GlassFish により、Rails アプリケーションの開発効率を活かしつつ Java EE アプリケーションに蓄積されたビジネス・ナレッジを活用することが可能となります。