以前のエントリで、clojure+compojure+h2は最強の組み合わせではないか、と書きましたが、また最近この組み合わせでお手軽アプリを作成しようかと考えました。

以前にインストールしたバージョンで作成しても良かったのですが、いろいろと新しくなっているだろうと思い、最新版で試してみました。そうしたら、相当以前とはインストールの仕方なども異なっているようです。まず、Leiningenをインストールします。そして、プロジェクトを作成し、project.cljを編集して必要なライブラリをインストールするよう指示します。次のような感じになりました。


(defproject myproject "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [ring "0.3.0"]
                 [com.h2database/h2 "1.2.142"]
                 [compojure "0.4.1"]])


そして次に、プロジェクトディレクトリに次の内容でrun.shを作成します。

#!/bin/sh
CLASSPATH=""
for f in ./lib/*.jar; do
    CLASSPATH=$CLASSPATH:$f
done

java -cp $CLASSPATH clojure.main -i src/myproject/core.clj

これで、run.shを実行すると、src/myproject/core.cljが実行されます。

core.cljも、昔とは(といっても1年たっていないのに)大分記述方法が異なります。まず冒頭のns記述は次のような感じ:

(ns myproject.core
    (:use compojure.core, ring.adapter.jetty)
    (:require [compojure.route :as route])
    (:import (java.sql Date)))

リクエストをディスパッチする方法も変わっています:

(defroutes dispatch
  (GET "/" {params :params}
       (dispatch-sub params))
  (POST "/" {params :params}
        (dispatch-sub params))
  (route/not-found "Page not found"))

(run-jetty dispatch {:port 8080})

ここでは、dispatch-subという別の関数が定義されている前提です。リクエストパラメタの取得方法が以前と変わりました。これはCompojure Demystified with an exampleをみて分かりました。

いやはや、かなり面倒に感じました。

Comments