読者です 読者をやめる 読者になる 読者になる

lein uberjar で standalone な jar ファイルを作る

Clojure のビルドツールといえば leiningen です。

これが無いとやってられません。というか凄く良く出来てます。

さて leiningen の lein uberjar というコマンドはなにやらスタンドアローンで動く jar ファイルを作ってくれるようです。

ということは Ring を使ってみたこの間のサンプルもスタンドアローンで動くようになるということです。

さっそく試してみました。

(:gen-class) を設定する

なにやら (:gen-class) を設定しないといけないようです。ということで設定してみました。
(:gen-class) が何してくれるのかは必要になったら調べます。

(ns snowflake.core
  (:gen-class)
  (:use compojure.core
        ring.adapter.jetty)
  (:require [clj-json.core :as json]
            [compojure.route :as route]
            [compojure.handler :as handler]))

(defroutes main-routes
  (GET "/" [] (json/generate-string {"はろー" "わーるど"}))
  (route/resources "/")
  (route/not-found "Page not found"))

(def app (handler/site main-routes))

(defn -main []
  (let [port (Integer/parseInt (get (System/getenv) "PORT" "8080"))]
    (run-jetty main-routes {:port port})))

:main snowflake.core を指定する

また project.clj に :main を指定する必要もあるようです。
ということで指定してみました。main があるのは snowflake の core.clj です。

(defproject clj-snowflake "1.0.0-SNAPSHOT"
  :description "snowflake"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [ring "1.0.0-RC2"]
                 [compojure "1.0.0-SNAPSHOT"]
                 [clj-json "0.4.3"]
                 [clj-time "0.3.3"]]
  :main snowflake.core
  :dev-dependencies [[lein-ring "0.4.6"]]
  :ring {:handler snowflake.core/app})

lein uberjar

さてそれでは早速実行してみましょう

% lein uberjar
Compiling snowflake.core
Compilation succeeded.
Created /work/clj-snowflake/clj-snowflake-1.0.0-SNAPSHOT.jar
Including clj-snowflake-1.0.0-SNAPSHOT.jar
Including clj-json-0.4.3.jar
Including clj-stacktrace-0.2.2.jar
Including clj-time-0.3.3.jar
Including clojure-1.3.0.jar
Including clout-1.0.0-RC1.jar
Including commons-codec-1.4.jar
Including commons-fileupload-1.2.1.jar
Including commons-io-1.4.jar
Including compojure-1.0.0-20111019.122151-1.jar
Including core.incubator-0.1.0.jar
Including hiccup-0.3.7.jar
Including jackson-core-asl-1.5.0.jar
Including java.classpath-0.1.0.jar
Including jetty-6.1.25.jar
Including jetty-util-6.1.25.jar
Including joda-time-2.0.jar
Including ns-tracker-0.1.1.jar
Including ring-1.0.0-RC2.jar
Including ring-core-1.0.0-RC2.jar
Including ring-devel-1.0.0-RC2.jar
Including ring-jetty-adapter-1.0.0-RC2.jar
Including ring-servlet-1.0.0-RC2.jar
Including servlet-api-2.5-20081211.jar
Including servlet-api-2.5.jar
Including tools.macro-0.1.0.jar
Including tools.namespace-0.1.0.jar
Created /work/clj-snowflake/clj-snowflake-1.0.0-SNAPSHOT-standalone.jar

二つファイルが出来たようです。

動かしてみます

$ java -jar clj-snowflake-1.0.0-SNAPSHOT-standalone.jar
2011-11-28 20:58:19.041:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2011-11-28 20:58:19.045:INFO::jetty-6.1.x
2011-11-28 20:58:19.143:INFO::Started SocketConnector@0.0.0.0:8080

なにやら動いているようです。ブラウザで 127.0.0.1:8080 にアクセスしたら見れました。

これは便利ですね、というか Java が便利なんでしょうね、多分。