これまでさんざんClojureのビルドツールとしてLeiningenを推してきましたが。Leiningenの気に入らない点として
- Javaをビルドできない(プラグイン作ればすぐ出来そうな気もするけど)
- 毎回jarがlibディレクトリにコピーされる
を感じていました。
mavenなら↑のようなことはないので、mavenでClojureがコンパイルできてrepl起動して、swank-server立ち上げられるといいなと思っていたら、とっくにありますね、clojure-maven-plugin。
このプラグインを使ってすぐにMavenでClojureを使えるようにblankプロジェクトを作ってGithubにコミットしました。
maven-clojure-blank
blank project取得
$ git clone git://github.com/making/maven-clojure-blank.git
.git
ディレクトリを削除して、project名(ディレクトリ名、pom.xmlの設定)を変えて使ってください
コンパイル
mvn compile
でClojureコードもJavaコードもコンパイルできます。ソースフォルダに
src/main/clojure/am/ik/blank/hello.clj src/main/java/am/ik/blank/Hello.java
があったとき、
$ mvn compile $ find target/classes target/classes target/classes/am target/classes/am/ik target/classes/am/ik/blank target/classes/am/ik/blank/hello$foo__3.class target/classes/am/ik/blank/hello$loading__6309__auto____1.class target/classes/am/ik/blank/Hello.class target/classes/am/ik/blank/hello__init.class
と両方classファイルできてますね。OK。
Clojureのコンパイルだけしたい場合はmvn clojure:compile
テスト
src/test/clojure
にテストコード書いておけばmvn test
でjavaのテストと一緒にclojureのテストも行われます。
Clojureのテストだけしたい場合はmvn clojure:test
REPL
replもできます。特徴はクラスパスでしょう。
$ mvn clojure:repl Clojure 1.1.0 user=> (use 'clojure.contrib.classpath) nil user=> (doseq [cp (classpath)] (println cp)) ## # # # # # # # # # # nil
clojureのソースディレクトリ、ビルド出力ディレクトリ、pom.xmlで指定した依存ライブラリが含まれています。これでJavaをコンパイルしてもすぐにreplで使えますね。
swank
Lisp開発と言えばやっぱりSlimeを使いたいですよね。mavenでswank-serverを立ち上げることでrepl同様のクラスパス込の状態で使えます。mvn clojure:swank
でswank立ち上げたあとemacsでM-x slime-connect
でOK。
スクリプト実行
以下のようにconfiguration
のscript
に実行したいclojureスクリプトのパスを書いておけばmvn clojure:run
でロードされます。もちろんクラスパスは同上。
com.theoryinpractise clojure-maven-plugin 1.3.1 ...
これだけ書くとleiningenいらないじゃんって思いそうですが、
mavenは立ち上がりが遅いのでちょっとイラッとするかもです。(Leinigenも結構遅いですがw)
Javaでライブラリを開発してClojureで呼び出すっていう使い方をしたい場合はこの方式が良さそうです。
ClojureのみのプロジェクトであればLeiningenで十分かなと思います。