antでcljファイルをコンパイル(build.xmlのひな形)

antでcljファイルをコンパイル後、jarにアーカイブするためのbuild.xmlを作成した。

プロジェクト構成

プロジェクトのディレクトリ構成は以下の通り。

hogeapp/ … プロジェクトディレクトリ
  src/ … ソースファイル
    sample/hoge/hogeapp.clj … サンプルアプリ
  classes/ … クラスファイル
  lib/ … ライブラリ
    clojure.jar
    clojure-contrib.jar
  hogeapp.jar

サンプルアプリ

コマンドライン引数を標準出力に出力する簡単なアプリ。

(ns hogeapp
  (:gen-class))

(defn -main [& args]
  (doseq [arg args]
    (println arg)))

build.xml

配布と実行が簡単にできるように、libディレクトリにあるclojure.jar,clojure-contrib.jarもまとめてアーカイブし、実行可能なjarを作成する。

<?xml version="1.0" encoding="UTF-8"?>
<project name="hogeapp" default="all">

  <description>
    Sample build.xml for *.clj files.
  </description>

  <property name="src" value="src"/>
  <property name="classes" value="classes"/>
  <property name="lib" value="./lib"/>

  <property name="destfile" value="hogeapp.jar"/>
  <property name="mainclass" value="sample.hogeapp"/>

  <target name="init">
    <mkdir dir="${classes}"/>
  </target>

  <target name="compile" depends="init">
    <java classname="clojure.lang.Compile">
      <classpath>
	<fileset dir="${lib}">
	  <include name="*.jar"/>
	</fileset>
	<pathelement path="${src}:${classes}"/>
      </classpath>
      <sysproperty key="clojure.compile.path" value="${classes}"/>
      <arg value="sample.hogeapp"/>
    </java>
  </target>

  <target name="jar" depends="compile">
    <jar destfile="${destfile}">
      <zipfileset dir="${classes}"/>
      <!-- lib配下のjarもまとめてアーカイブする -->
      <zipgroupfileset dir="${lib}" includes="*.jar"/>
      <manifest>
	<attribute name="Main-Class" value="${mainclass}"/>
      </manifest>
    </jar>
  </target>

  <target name="all" depends="jar">
  </target>

  <target name="clean">
    <delete dir="${classes}"/>
  </target>

</project>

cljファイルのコンパイルにはclojure.jarに含まれるclojure.lang.Compileクラスを使用する。compileターゲットに記述したように、javaタスクを使用してコンパイルする。

javaタスクに設定する属性と子要素

要素 属性
java classname clojure.lang.Compile
+classpath クラスパスを設定(※srcとclassesも必要)
+sysproperty key clojure.compile.path
value classes
+arg value コンパイルするcljファイル(※拡張子は不要)

cljファイルが複数の場合は、そのファイル分だけarg要素を追加する。

ビルドと実行

ビルドしてみる。

satoshi@ubuntu:~/workspace/hogeapp$ ls
build.xml  lib  src
satoshi@ubuntu:~/workspace/hogeapp$ ant 
Buildfile: build.xml

init:
    [mkdir] Created dir: /home/satoshi/workspace/hogeapp/classes

compile:
     [java] Compiling sample.hogeapp to classes

jar:
      [jar] Building jar: /home/satoshi/workspace/hogeapp/hogeapp.jar

all:

BUILD SUCCESSFUL
Total time: 12 seconds
satoshi@ubuntu:~/workspace/hogeapp$ ls
build.xml  classes  hogeapp.jar  lib  src ←◆hogeapp.jarができた

さて、実行だ。

satoshi@ubuntu:~/workspace/hogeapp$ java -jar hogeapp.jar one two three
one
two
three

動いた。\(^▽^)/