Skip to main content

Rails and Java EE integration - Warbler instead of Goldspike

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



href="http://blogs.sun.com/arungupta/entry/rails_and_java_ee_integration">Part
1 of this tri-series blog explained how a Java EE
Servlet and Rails application can be packaged together as WAR file
using Goldspike
plugin
and deployed on GlassFish
v2 UR1
. There are few issues with Goldspike as explained href="http://blog.nicksieger.com/articles/2007/09/04/warbler-a-little-birdie-to-introduce-your-rails-app-to-java">here.
A better and recommended option is to use href="http://wiki.jruby.org/wiki/Warbler">Warbler
for packaging which provides a minimal, flexible and Ruby-like way to
create WAR. Warbler really cleans up the packagingof WAR, for example
excluding .svn directories, tests and migrations - really nice. For
now, it uses RailsServlet for dispatching but even that is pluggable.



This blog, Part 2, will explain how to generate a WAR file using
Warbler. href="http://developers.sun.com/appserver/reference/techart/rails_gf/">Rails
powered by GlassFish provides all the details on why
GlassFish provides an industry-grade and functionally-rich Application
Server.



Now detailed steps:

  1. In an existing JRuby
    1.1
    installation (enabled with Rails), install Warbler gem:


    cellpadding="2" cellspacing="2">
    ~/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. Create a Rails app "railsee2" as:


    cellpadding="2" cellspacing="2">
    ~/testbed/jruby-1.1/samples/rails > style="font-weight: bold;">../../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



    In order to keep it simple, this application will not be using any
    database so uncomment the following line from
    "config/environment.rb"(by removing "#" from beginning of the line):


    cellpadding="2" cellspacing="2">
    config.frameworks
    -= [ :active_record, :active_resource, :action_mailer ]
  3. Create a new file "web.xml" in "config" directory and use
    the following contents:


    cellpadding="2" cellspacing="2">
    <!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>



    This "web.xml" is used by Warbler when packaging the WAR file.

  4. Create and Copy Servlet
    1. Create a Java library with Servlet code as explained in href="http://blogs.sun.com/arungupta/entry/rails_and_java_ee_integration">bullet
      #4 here.
    2. Copy "HelloServlet.jar" from "dist" directory of NetBeans
      project to "lib" directory of Rails application.
  5. Create and deploy the WAR
    1. Create a WAR file as:


      cellpadding="2" cellspacing="2">
      ~/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. Deploy the WAR to href="https://glassfish.dev.java.net/downloads/v2ur1-b09d.html">GlassFish
      v2 UR1 as:


      cellpadding="2" cellspacing="2">
      ~/testbed/jruby-1.1/samples/rails/railsee2
      >~/testbed/glassfish/v2ur1/glassfish/bin/asadmin
      deploy railsee2.war


      Command deploy executed successfully.
  6. The bundled Servlet is now accessible at
    "http://localhost:8080/railsee2/hello". The default browser output
    looks like:



    src="http://blogs.sun.com/arungupta/resource/ror/warbler-hello-world-default-output.png">



    And passing a parameter to the URL as
    "http://localhost:8080/railsee2/hello?name=Arun" shows the output as:



    src="http://blogs.sun.com/arungupta/resource/ror/warbler-hello-world-custom-output.png">

With this, your Java EE Servlet is now bundled with your Rails
application deployed on GlassFish v2 UR1.



Now, lets add Controller and View to Rails application and invoke this
servlet from there to show complete integration with Rails.

  1. Create a new Controller and View as


    cellpadding="2" cellspacing="2">
    style="font-weight: bold;">~/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
  2. Change the generated controller in
    "app/controllers/home_controller.rb" to:


    cellpadding="2" cellspacing="2">
    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
  3. Change the generated view in
    "app/views/home/index.rhtml.erb" to:


    cellpadding="2" cellspacing="2">
    <h1>Home#index</h1>

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



    <%= @servlet_output %>
  4. Re-create the WAR as describd in bullet # 5 above. And now
    "http://localhost:8080/railsee2/home/index" shows the output as shown:



    src="http://blogs.sun.com/arungupta/resource/ror/warbler-hello-wolrd-servlet-output.png">

This blog explained how a Java EE 5 Servlet and Rails application can
be packaged Warbler and deployed on GlassFish. href="http://caldersphere.rubyforge.org/warbler/">Warbler
docs provide detail about usage, configuration, web.xml and
other details.



The next blog in this tri-series blog will explain how such an
application can be deployed on GlassFish v3. And the cool thing there
is that you don't need Goldspike, Warbler or any other additional
plugins - total native deployment, stay tuned!





Technorati: href="http://technorati.com/tags/rubyonrails">rubyonrails
netbeans
glassfish
v3 href="http://technorati.com/tags/javaee5">javaee5
servlets
jruby
ruby href="http://technorati.com/tags/warbler">warbler

Related Topics >>

Comments

<p>Hi,</p> <p>This is really great help towards the ...

Hi,

This is really great help towards the objective mentioned. Thanks Arun for this.

I am facing one problem. I could reach successfully till step number 9.

The moment I create my own('home' as specified in step 10) controller and hit the URL mentioned, I get 404 error stating "The requested resource (/POC/home/index) is not available."

Please do the needful.

Thanks in advance,

Thanks and Regards,

SachinJadhav

<p>Hi,</p> <p>This is really great help towards the ...

Hi,

This is really great help towards the objective mentioned. Thanks Arun for this.

I am facing one problem. I could reach successfully till step number 9.

The moment I create my own('home' as specified in step 10) controller and hit the URL mentioned, I get 404 error stating "The requested resource (/POC/home/index) is not available."

Please do the needful.

Thanks in advance,

Thanks and Regards,

SachinJadhav