SinatraをServletEngine上で実行

Ruby の Web アプリケーション用 DSL である SinatraJava の ServletEngine 上で実行してみます。
Warbler を使えば、容易に war ファイル化できるので、それを配置するだけなのですが、今回は手動で作ってみました。

手順は以下の通りです。

  1. 事前準備
  2. JAR ファイルの配置
  3. gem の配置
  4. Sinatra の DSL ファイル作成
  5. web.xml ファイル作成
  6. ServletEngine への配置

なお、使用した環境は以下の通りです。

事前準備

まず、gem を使って Sinatra をインストールしておきます。

>gem install sinatra

次に、JRuby ダウンロードサイトから JRuby 1.5.0.RC2 Complete.jar をダウンロードします。(Complete.jar を使う点に注意)

最後に、JRuby-Rack サイトから jruby-rack-0.9.7.jar ファイルをダウンロードします。(gem install warbler で Warbler と共に JRuby-Rack をインストールする方法もある)

JAR ファイルの配置

適当なディレクトリに WEB-INF/lib ディレクトリを作成して事前準備でダウンロードした JAR ファイルを配置します。

  • WEB-INF/lib/jruby-complete-1.5.0.RC2.jar
  • WEB-INF/lib/jruby-rack-0.9.7.jar

gem の配置

WEB-INF/gems ディレクトリを作成して、rack-1.0.1 と sinatra-1.0 の gems を配置します。

  • WEB-INF/gems/gems/rack-1.0.1
  • WEB-INF/gems/gems/sinatra-1.0
  • WEB-INF/gems/specifications/rack-1.0.1.gemspec
  • WEB-INF/gems/specifications/sinatra-1.0.gemspec

Sinatra の DSL ファイル作成

Sinatra の DSL ファイルを作成します。今回は WEB-INF/testapp.rb として作成しました。(web.xml で指定するので作成場所やファイル名は何でもよい)

testapp.rb
require 'rubygems'
require 'sinatra'

get '/' do
    'test page'
end

get '/:name/:value' do |n, v|
    "test page : #{n} - #{v}"
end
  • WEB-INF/testapp.rb

web.xml ファイル作成

WEB-INF/web.xml ファイルを以下のような内容で作成します。context-param の rackup の value で作成した DSL ファイル(testapp.rb)を require する点に注意。(.rb は不要)

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 
 <context-param>
   <param-name>rackup</param-name>
   <!-- DSL ファイルを require する -->
   <param-value>
     require 'testapp'
     run Sinatra::Application
   </param-value>
 </context-param>
 <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>org.jruby.rack.RackServletContextListener</listener-class>
 </listener>
</web-app>
  • WEB-INF/web.xml

ServletEngine への配置

最後に、作成した構成を war ファイル化して ServletEngine に配置すれば動作すると思います。
例えば、Apache Tomcat の webapps ディレクトリにそのまま配置して(例 testapp/WEB-INF)、http://localhost:8080/testapp/test/10 にアクセスすれば "test page : test - 10" と表示されます。