Posted at

Jarkの使い方メモ

More than 5 years have passed since last update.


Jarkの使い方メモ

Clojureにはleiningenという便利なツールがありますが


  • 小さなスクリプト的な使い方をしたい

  • テストを小まめに走らせたい

などのときにlein自体の起動(というかjvmの起動)の遅さが気になってきます。どうにかしたいと思って調べていったところ、jarkというのが便利そうだったので、使い方を調べてみることにしました。

というか本家のほうでtest/script.clj --foo "a" --bar "b"という感じで動かせると書いてあるんですが、これだといくら頑張っても動かなかった。。。それとjark ns load XXX.cljもダメでした。なんでだろう。。。


インストール

clojureのツールだけど、ocamlで書かれているようです。ダウンロードのページから持ってくるか、自分でビルトしましょう。僕は自分でビルトしました。

ビルトの仕方はこの辺。いくつか足りないものがあったので、sudo port install ocaml-findlibsudo port install camlp5付近を実行して入れておきました。できたバイナリを~/bin/jarkで保存しておきます(付いてるとは思うけど、実行権限が付いているか確認)。


起動の方法

jarkはサーバーを立ち上げておいて、あとでクライアントから接続して使うという形です。なので、まずサーバーを立ち上げましょう。

/Users/yasuhisa/Dropbox/lda_clj% jark server start                                                     

java -Xms256m -Xmx512m -cp /Users/yasuhisa/.cljr/lib/jark-0.4-SNAPSHOT-clojure-1.3.0-standalone.jar clojure.tools.jark.server 9000 &
Started JVM on port 9000

--host--portなどもオプションも指定できるようですが、portが被ったりして困らない限りはとりあえずディフォルトでよさそう。


パスの追加

実際に使う際にはjarファイルのパスをクラスパスに追加しないといけません。jark cp add <path>という感じでpathに追加できるようです。以下、実際の例。

/Users/yasuhisa/Dropbox/lda_clj% jark cp add lib                  

Added jar lib/cdt-1.2.6.2.jar
Added jar lib/clj-http-0.2.7.jar
Added jar lib/clj-stacktrace-0.2.4.jar
Added jar lib/clojure-1.2.0.jar
Added jar lib/clojure-contrib-1.2.0.jar
Added jar lib/commons-codec-1.5.jar
Added jar lib/commons-io-2.1.jar
Added jar lib/commons-logging-1.1.1.jar
Added jar lib/commons-math-2.2.jar
Added jar lib/data.json-0.1.1.jar
Added jar lib/debug-repl-0.3.1.jar
Added jar lib/httpclient-4.1.2.jar
Added jar lib/httpcore-4.1.2.jar
Added jar lib/httpmime-4.1.2.jar
Added jar lib/jark-0.4-20120206.025450-1.jar
Added jar lib/java.classpath-0.1.0.jar
Added jar lib/server-socket-1.0.0.jar
Added jar lib/slingshot-0.9.0.jar
Added jar lib/swank-clojure-1.4.0.jar
Added jar lib/tools.namespace-0.1.0.jar
Added jar lib/tools.nrepl-0.0.5.jar

jark cp add srcjark cp add testも忘れずに実行しておきましょう(No jars found in directoryとか言われるけど、これやらないとうまくいかなかった)。


実際に使う


スクリプト的な使い方

実際に使うときはこんな感じで動かせるようです。

jark -e '((load-file "src/lda_clj/core.clj") "--file" "tmp.txt" "--max-iter" "10")'             

jvmの起動の遅さにイライラしないでよくなるので快適。


テスト

Clojureのテストもjarkで走らせるようにしましょう。例えば、こんな感じでテストのファイルが

(ns lda_clj.test.util

(:use [lda_clj.util])
(:use [clojure.test]))

いくつかあったときに、以下のようにやるとマッチした名前空間中のテストを全部走らせてくれます。

jark -e '(use (quote clojure.test) (quote lda_clj.test.util) (run-all-tests #"lda_clj.test.*")'

正規表現で書いておかないとライブラリのテストなども走ってしまうので注意が必要です。いくつもテストファイルがある場合、一個一個書いていると面倒ですし、漏れが出てきます。leinだとlein testで全部走ってくれますが、それ相当のを簡単にやる方法が分からなかったので、ちょっと長いけどこんな感じのを書いてみました。

/Users/yasuhisa/Dropbox/lda_clj% jark -e '

(use (quote clojure.test))
(use (quote clojure.contrib.string))

(let [my-package-name "lda_clj"]
(dorun (map (fn [file-name]
(->> file-name
(clojure.contrib.string/split #"\\.")
(first)
(str my-package-name ".test.")
(symbol)
(use)))
(.list (new java.io.File (str "test/" my-package-name "/test")))))
(run-all-tests
(->> ".test.*"
(str my-package-name)
(re-pattern))))
'

これでuseしてくれつつ、全部testが走るようになります。