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.xmlはscala-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