Rails と Java EE の連携 - Rails からサーブレットを呼び出すPosted by arungupta on April 04, 2008 at 08:04 AM GlassFish に Rails アプリケーションを配備する利点の一つは、 Railsと Java EE アプリケーションを同一のコンテナ上で連携させられるということでしょう。 このブログでは、JRuby-on-Rails (jRoR) と Java EE の融合について、少し踏み込んで考えてみたいと思います。 なお、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 のライブラリを作成:
Cannot resolve external resource into attachment.
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にてサーブレットにアクセスすることができます。 Cannot resolve external resource into attachment. ちなみに、 "http://localhost:8080/railsee1/hello?name=Arun" のように URL にパラメータを指定すると次のように表示されます: Cannot resolve external resource into attachment. さて、これで GlassFish v2 UR1 上の Rails アプリケーションに Java EE のサーブレットが追加されました。 まさに 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 ファイルを再作成 & 再配備。 Cannot resolve external resource into attachment. 以上、 GlassFish 上に配備した Rails アプリケーション から Java EE 5 サーブレットを呼び出す手順をご紹介しました。 日本語翻訳: Kana |