ClojureでCompojureを使わずにサーブレットを書く方法

Clojureでgen-class、proxyを使ってみようと思い、試しにサーブレットを書くとどうなるかを試してみました。

コンパイルにLeiningenを使うためプロジェクトを作ります。

lein new sample-servlet

まずはsrc/sample_servlet/servlet.cljを書いてみます。

(ns sample_servlet.servlet
  (:gen-class
   :extends javax.servlet.http.HttpServlet))

(defn -servlet [this request response]
  (.setContentType response "text/html; charset=UTF-8")
  (let [out (.getWriter response)]
    (.. out
 (println "<html><body>hello world</body></html>"))))

(defn -doGet [this request response]
  (-servlet this request response))

依存関係とクラスファイル生成のオプションを与えたproject.cljファイルを作りました。

(defproject sample-servlet "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.1.0"]
                 [org.clojure/clojure-contrib "1.1.0"]
   [javax.servlet/servlet-api "2.5"]
   ]
  :namespaces [sample_servlet.servlet])

必要なライブラリを取得しコンパイル。

lein deps
lein compile

無事生成されたことが分かります。

% ls -lr classes/sample_servlet 
total 48
-rw-r--r--  1 tnoborio  staff  2617  2 24 16:03 servlet__init.class
-rw-r--r--  1 tnoborio  staff  6178  2 24 16:03 servlet.class
-rw-r--r--  1 tnoborio  staff  1631  2 24 16:03 servlet$loading__6309__auto____12.class
-rw-r--r--  1 tnoborio  staff  1401  2 24 16:03 servlet$_servlet__14.class
-rw-r--r--  1 tnoborio  staff  1006  2 24 16:03 servlet$_doGet__17.class

と、ここからサーブレットを起動させる方法はいくつもありますが、
以下のページを基にJettyとMavenを使った方法を試しました。

Re: Deploying Leiningen project as WAR file?

1. project.cljに :compile-path "target/classes" を追加する。Jettyが見るパスがtarget/classesになっているのでそのためです。
2. src/main/webapp/WEB-INF/web.xmlを作る。今回作ったサーブレットsample_servlet.servletを指定します。

<web-app>
  <display-name>Sample Servlet</display-name>
     <servlet>
       <servlet-name>s</servlet-name>
       <servlet-class>sample_servlet.servlet</servlet-class>
     </servlet>
     <servlet-mapping>
       <servlet-name>s</servlet-name>
       <url-pattern>/</url-pattern>
     </servlet-mapping>
   </web-app>

3. "lein pom"でpom.xmlファイルを生成。生成されたpom.xmlに以下のリンクの内容を追加します。
http://github.com/gmfawcett/simplest/commit/44d978c55ae02112647a743b6f957156787fba25

4. "mvn jetty:run"でjettyが起動します。今回のプロジェクト名なら以下でアクセスできます。
http://localhost:8080/sample-servlet/

最初はどこまでをLeiningenがやってくれてどこからがMavenの範囲か分かりませんでしたが動かしてみて分かりました。次はHadoopとClojureを絡ませられればと思います。

コメント

人気の投稿