Clojureでgen-class、proxyを使ってみようと思い、試しにサーブレットを書くとどうなるかを試してみました。
コンパイルにLeiningenを使うためプロジェクトを作ります。
まずはsrc/sample_servlet/servlet.cljを書いてみます。
依存関係とクラスファイル生成のオプションを与えたproject.cljファイルを作りました。
必要なライブラリを取得しコンパイル。
無事生成されたことが分かります。
と、ここからサーブレットを起動させる方法はいくつもありますが、
以下のページを基に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を指定します。
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を絡ませられればと思います。
コンパイルに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を絡ませられればと思います。
コメント