In my last blog, I wrote about recent JRuby on Rails project I did at amazon. In this blog, I will show some technical details on setting up JRuby on Rails with Tomcat. I used 2.1.1 of Rails and 1.1.4 of JRuby, here are steps to setup JRuby and Rails:
- Download Jruby 1.1.4 from http://dist.codehaus.org/jruby/
- Setup JRUBY_HOME and PATH
export JRUBY_HOME=installed directory of jruby export PATH=$JRUBY_HOME/bin:$PATH
- Install Rails
gem install rails -y
- Install ActiveRecord JDBC Adapter
jruby -S gem install activerecord-jdbc-adapter
- Install warbler plugin to create war file, older version of Rails (1.2 or older) used goldspike but the newer version requires warbler
jruby -S gem install -y warbler
- Edit config/environment.rb and add
if RUBY_PLATFORM =~ /java/ require 'rubygems' RAILS_CONNECTION_ADAPTERS = %w(jdbc) end
- Download mysql-jdbc driver as I used MySQL. (You may have to download different driver. )
- Copy mysql-connector-java-5.1.6-bin.jar to lib directory of jruby
- You can edit config/warble.rb and add other jar files or directories, e.g.
config.java_libs += FileList["lib/*.jar"] config.pathmaps.java_classes << "%{build/classes/,}p" config.webxml.jruby.min.runtimes = 2 config.webxml.jruby.max.runtimes = 24
- Edit config/environment.rb and add define adapter, driver and url as follows:
development: adapter: jdbc driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/rspm_development username: rspmdb_user password: secret test: adapter: jdbc driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/rspm_test username: rspmdb_user password: secret production: adapter: jdbc driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/rspm_production username: rspmdb_user password: secret
- Create a template web.xml.erb in config directory, e.g.
<!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> <% webxml.context_params.each do |k,v| %> <context-param> <param-name><%= k %></param-name> <param-value><%= v %></param-value> </context-param> <% end %> <servlet> <servlet-name>Rails</servlet-name> <servlet-class>org.jruby.rack.RackServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Rails</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <filter> <filter-name>RackFilter</filter-name> <filter-class>org.jruby.rack.RackFilter</filter-class> </filter> <filter-mapping> <filter-name>RackFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class><%= webxml.servlet_context_listener || 'org.jruby.rack.RackServletContextListener'%></listener-class> </listener> </web-app>
- Now create war file
jruby -S warble
- Finally copy the war file to webapps directory of standard J2EE web container, in my case Tomcat 6.0
- Now point the browser to your server, e.g. http://localhost:8080/your-controller and voilla.
On final note, I found warble quite slow in generating war file and tomcat takes a while to deploy the war file, so I use WEBrick for development and Tomcat for staging/production.