Javaのエントリポイントから実行を開始してScalaのコードを呼ぶ。そういうプロジェクトのantの書き方

Javaのmainで開始して、中でScalaを呼ぶ混ざったプロジェクトをantでビルドする方法について。


ディレクトリ構成はこんな感じで。

project
  +build.xml
  +src
    +Main.java
    +Loader.scala


Scalaには、antのタスクが添付されている。
http://www.scala-lang.org/node/98
で、antで追加のタスクを定義するにはbuild.xmlの中でtaskdefする必要があって、
そのタスクはscala/tools/ant/antlib.xmlで定義されている。
antlib.xmlscala-compiler.jarの中に入っている。要するに下記のようになる。

<?xml version="1.0" encoding="UTF-8"?>
<project name="JavaWithScala" default="compile">

    <property name="src" value="src" />
    <property name="classes" value="classes" />
    <property name="scala.lib" value="T:/scala-2.8.0.final/lib/scala-library.jar" />
    <property name="scala.compiler" value="T:/scala-2.8.0.final/lib/scala-compiler.jar" />

    <target name="init">
        <taskdef resource="scala/tools/ant/antlib.xml">
            <classpath>
                <pathelement location="${scala.lib}" />
                <pathelement location="${scala.compiler}" />
            </classpath>
        </taskdef>
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${classes}"/>
        <fsc srcdir="${src}"
            destdir="${classes}">
        </fsc>
        <javac srcdir="${src}" 
            includeAntRuntime="no"
            destdir="${classes}">
            <classpath>
                <pathelement path="${scala.lib}" />
            </classpath>
        </javac>
    </target>

    <target name="run" depends="compile">
        <java classname="Main"
            classpath="${classes}" >
            <classpath>
                <pathelement path="${scala.lib}" />
            </classpath>
            <arg path="build.xml" />
            <arg path="src/Main.java" />
        </java>
    </target>

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

とりあえず行数数えるだけ。
Loader.scala

class Loader {
    var path="";
    var lines=0;
    def load(src :String) :Boolean={
        path=src;
        lines=0;
        try {
            scala.io.Source.fromFile(src).getLines.foreach(_ => lines+=1);
            return true;
        }
        catch {
            case e =>
                println(e)
                return false;
        }
    }
    override def toString() :String="<"+path+" "+lines.toString+" lines>"
}

エントリポイント。
Main.java

public class Main {
    public static void main(String[] args){
        Loader loader=new Loader();
        for(String arg: args){
            if(loader.load(arg)){
                System.out.println(loader);
            }
        }
    }
}

コンパイル&実行

$ ant run
Buildfile: T:\work2\scala\ant\build.xml

init:

compile:
      [fsc] Compiling 0 scala and 1 java source files to T:\work2\scala\ant\classes

run:
     [java] <T:\work2\scala\ant\build.xml 46 lines>
     [java] <T:\work2\scala\ant\src\Main.java 10 lines>

BUILD SUCCESSFUL
Total time: 1 second

確かにjavascalaを混ぜれる。