Rails and Java EE integration - Warbler instead of Goldspike
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 here. A better and recommended option is to use 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. Rails powered by GlassFish provides all the details on why GlassFish provides an industry-grade and functionally-rich Application Server.
Now detailed steps:
- In an existing JRuby
1.1 installation (enabled with Rails), install 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... - Create a Rails app "railsee2" as:
~/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
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):
config.frameworks -= [ :active_record, :active_resource, :action_mailer ] - Create a new file "web.xml" in "config" directory and use
the following contents:
<!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. - Create and Copy Servlet
- Create a Java library with Servlet code as explained in bullet #5 here.
- Copy "HelloServlet.jar" from "dist" directory of NetBeans project to "lib" directory of Rails application.
- Create and deploy the WAR
- Create a WAR file as:
~/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 . - Deploy the WAR to GlassFish
v2 UR1 as:
~/testbed/jruby-1.1/samples/rails/railsee2 >~/testbed/glassfish/v2ur1/glassfish/bin/asadmin deploy railsee2.war
Command deploy executed successfully.
- Create a WAR file as:
- The bundled Servlet is now accessible at
"http://localhost:8080/railsee2/hello". The default browser output
looks like:

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

Now, lets add Controller and View to Rails application and invoke this servlet from there to show complete integration with Rails.
- Create a new Controller and View as
~/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 - Change the generated controller in
"app/controllers/home_controller.rb" to:
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 - Change the generated view in
"app/views/home/index.rhtml.erb" to:
<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<%= @servlet_output %> - Re-create the WAR as describd in bullet # 5 above. And now
"http://localhost:8080/railsee2/home/index" shows the output as shown:

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!
- Login or register to post comments
- 322 reads
- Flag as offensive
- Printer-friendly version






