2013年6月27日木曜日

Incanterを含むjarファイルを実行できない

project.cljは,

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core)

で,core.cljを

(ns incanter-sample.core
  (:gen-class))

(use '(incanter core))

(defn -main [& args]
  (do
    (def A (matrix [[1 2 3] [4 5 6] [7 8 9]]))
    (println A)
    ))

な感じに作成した.
"lein run"すれば行列が表示されるんだけど,"lein uberjar"してjarファイルを作ってから"java -jar"で実行すると,

java.lang.SecurityException: no manifiest section for signature file entry…

みたいな例外を吐く.

"lein uberjar"するときにで署名ファイルを除外するためには,project.cljに:uberjar-exclusions [#"除外したい署名ファイル.SF"]を追加すれば良い.
全部の署名ファイルを除外してしまうのが楽だけど,ファイルの名前が分からないので,

$ unzip -l 署名で怒られるjarファイル.jar | grep -i -e "\.sf"

を実行し,*.SFを探して:uberjar-exclusionsに渡す.

前のIncanterのサンプルでは以下のようなproject.cljを使えば良い.

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 ;;[org.clojure/clojure "1.4.0"]
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core
  ;; Same thing, but for uberjars.
  :uberjar-exclusions [#"META-INF/BCKEY.SF"]
  )