---
title: clojure-maven-pluginを使ってMavenでClojure+Javaビルド
tags: []
categories: ["Programming", "Lisp", "Clojure"]
date: 2010-03-13T16:50:58Z
updated: 2010-03-13T17:48:18Z
---

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