Clojure開発プロセス maven

= talios / clojure-maven-plugin = 参照
 * https://github.com/talios/clojure-maven-plugin

このプラグインはmaven 3用です. (maven 2では動きません.Plugin requires Maven version 3.0エラーが出ます) (readmeにはmaven2用と書いてあるが？？？)

ひな形作成
通常のJavaプロジェクトとしてひな形を作成.

以下のようなディレクトリ構造ができるので、mainの下とtestの下にclojureディレクトリを自分で作る. my-app |-- main |  `-- java |      `-- com |          `-- mycompany |              `-- app |                  `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java
 * -- pom.xml
 * -- src

次にpom.xmlを編集する. 典型例は以下の通り. 1.6 		 UTF-8 maven-surefire-plugin 2.3        org.apache.maven.plugins maven-javadoc-plugin true 1g org.apache.maven.plugins maven-site-plugin ja          UTF-8 UTF-8 org.apache.maven.wagon wagon-webdav</artifactId> 1.0-beta-2 <id>private-webdav-repository</id> oga private dav:http://www.oga-lab.net/maven2 <id>private-webdav-snapshot-repository</id> oga private snapshot dav:http://www.oga-lab.net/maven2/maven2-snapshot <id>clojars.org</id> http://clojars.org/repo
 * 1) packagingでclojureを指定する.
 * 2) dependencyでclojureを指定する.
 * 3) dependencyでjlineを指定するとmvn clojure:replでjlineが使われる.
 * 4) * Emacsの中からREPLを使うときはかえって不便.
 * 5) * その場合は下記のpom.xmlのように <clojureOptions>-Djline.terminal=jline.UnsupportedTerminal</clojureOptions> を指定するとよい.
 * 6) * (mavenがEnabling JLine supportと表示するが気にしなくて良い）
 * 7) dependencyでclojure-swankを指定する. (readmeでは1.3.0-SNAPSHOTとなっているが1.3.1以上でないとうまく動かない)
 * 8) pluginでclojure-maven-pluginを指定する.
 * 9) dependencyでincanterを指定する.
 * 10) repositoryでclojars.orgを指定する.

<distributionManagement> <uniqueVersion>false</uniqueVersion> <id>private-webdav-repository</id> oga private dav:http://www.oga-lab.net/maven2 <snapshotRepository> <uniqueVersion>true</uniqueVersion> <id>private-webdav-snapshot-repository</id> oga private snapshot dav:http://www.oga-lab.net/maven2/maven2-snapshot </snapshotRepository> </distributionManagement>

実行 (1) clojure
Available goals
 * clojure:add-source
 * clojure:add-test-source
 * clojure:compile
 * clojure:test
 * clojure:test-with-junit
 * clojure:run
 * clojure:repl
 * clojure:swank
 * clojure:nailgun
 * clojure:gendoc
 * clojure:autodoc
 * clojure:marginalia

良く使うのは
 * mvn clojure:repl
 * mvn clojure:compile
 * mvn package
 * mvn deploy

実行(2) incanter
このpom.xmlを使って例えばmvn clojure:replするとincanterが利用可能となる. ( http://data-sorcery.org/2009/12/20/getting-started/ 参照)

実行(3) swank
Emacsを使っている場合 mvn clojure:swank でswankを立ち上げた状態でEmacsでM-x slime-connectするとEmacsのバッファからREPLが使える. 先にEmacsのclojure-modeをインストールしておくこと.

Emacsの*shell*からmvn clojure:replしてもswankを使わずに似たことができる. 上記pom.xml参照. とか指定して、replを立ち上げる前にスクリプトを評価させておくこともできるし.

= clojure-archetype.git =

参照
 * https://github.com/stuartsierra/clojure-archetype

This is a Maven 2 archetype for Clojure projects. It will generate a new project pre-configured to use Clojure and the Clojure Maven plugin. (by Stuart Sierra)

ひな形作成
mvn archetype:generate \ -DgroupId=your.group.name \ -DartifactId=your-new-project-name \ -DarchetypeGroupId=com.stuartsierra \ -DarchetypeArtifactId=clojure-archetype \ -DarchetypeVersion=1.0-SNAPSHOT

例えばgroupId=net.example artifactId=helloとしたときに 作られるひな形のディレクトリ構造は以下の通り. hello `-- src |-- main |  |-- clojure |  |   `-- app.clj |  `-- resources |-- scripts |  `-- runtests.clj `-- test `-- clojure `-- testapp.clj main/clojureの下にgroupIdに相当するディレクトリ構造が作られるわけではないことに注意.
 * -- pom.xml


 * pom.xmlの内容
 * app.cljの内容
 * runtests.cljの内容
 * testapp.cljの内容

実行 (1) clojure

 * clojure:compile
 * clojure:run
 * clojure:test
 * src/scripts/runtests.cljが実行される.
 * clojure:repl

他のJavaライブラリと一緒にonejarファイルを作りたければ以下のようにする. mvn assembly:assembly -DdescriptorId=jar-with-dependencies このonejarを実行するには以下のようにする $ java -cp target/hello-1.0-SNAPSHOT-jar-with-dependencies.jar app This is the main function for app.
 * つまりapp.cljの-main関数が実行されている. (関数の頭に-がつくのはclojureのgen-classの仕様. )

To see more available goals, run (one line): mvn help:describe -DgroupId=com.theoryinpractise -DartifactId=clojure-maven-plugin

実行 (2) incanter
本家ページに書いてある通り、clojarサイト( http://clojars.org/ )にincanterが登録されている( http://clojars.org/incanter )ので、pom.xmlをちょっと編集してやると自動的にincanterがインストールされ利用可能になる.

pom.xmlの例は以下の通り.
 * dependencyでincanterを指定する.
 * repositoryでclojars.orgを指定する.

このpom.xmlを使って例えばmvn clojure:replするとincanterが利用可能となる. ( http://data-sorcery.org/2009/12/20/getting-started/ 参照)