当一个工程中源文件越来越多的时候,我们可以使用一个构建工具,方便的对整个工程进行构建。在Unix中,
最著名的一个构建工具就是make了。使用make和“Makefile”,完全可以构建scala工程,但这不是本文的关注
点。本文关注的是使用apache ant构建scala工程。
Ant这个构建工具对于从事c/c++开发的人可能比较陌生,但是对于从事java开发的人,应该非常熟悉。
Ant类似于传统的make工具,只是,它的“Makefile”是用xml写的,比make稍清晰一些。
在scala发布版的scala-compiler.jar包中,已经包含了ant使用的几个task及它们的定义文件,所以,当安装
好scala后,使用ant构建工程就很容易了。scala定义的任务包括fsc,scalac,scalascript,sbaz,scaladoc,
scalatool,same,pack200这几个(2.8版本)。其中,比较常用的是fsc、scalac和scaladoc。
在Ant的编译工作中,我们通常会给它指定源文件的根目录和目标文件的根目录,ant就会递归的搜索源文
件目录,对于找到的每个.scala文件,如果它在目标文件目录中没有对应的.class文件(或者对应的.class文件
.scala文件老),则会编译相应的.scala文件。使用ant管理scala工程的一个问题就在于,ant是根据.scala和
.class文件的文件名来确定应该重新编译哪些文件的,这一点在java中对应的很好,但是在scala中,对应的
就不那么好了。所以,为了避免问题,我们可以在编译任务中显式地指定需要编译的文件,代价就是,对于
.scala名字和.classes名字对应不上的源文件,每次都会重新编译。
下面是一个build.xml的例子:
- <?xml version="1.0" encoding="utf-8"?>
-
-
<project name="HelloWorld" default="compile">
-
-
<!-- global properties -->
-
<property name="scala.home"
-
value="/home/liangkun/programs/scala28" />
-
<property name="scala.library"
-
value="${scala.home}/lib/scala-library.jar" />
-
<property name="src.dir"
-
value="${basedir}/src" />
-
<property name="build.dir"
-
value="${basedir}/build" />
-
-
<!-- class path settings -->
-
<path id="build.classpath">
-
<pathelement location="${build.dir}" />
-
<pathelement location="${scala.library}" />
-
</path>
-
-
<!-- define scalac, fsc, sbaz ... tasks -->
-
<target name="scala.tasks">
-
<taskdef resource="scala/tools/ant/antlib.xml">
-
<classpath>
-
<pathelement location="${scala.home}/lib/scala-compiler.jar" />
-
<pathelement location="${scala.library}" />
-
</classpath>
-
</taskdef>
-
</target>
-
-
<target name="compile" depends="scala.tasks">
-
<mkdir dir="${build.dir}" />
-
<fsc srcdir="${src.dir}"
-
destdir="${build.dir}"
-
classpathref="build.classpath">
-
<include name="**/*.scala" />
-
</fsc>
-
</target>
-
-
<!-- run the program -->
-
<target name="run" depends="compile">
-
<java classname="HelloWorld"
-
classpathref="build.classpath" />
-
</target>
-
-
</project>
在上面,“scala.tasks”这个target用于为ant引入scala相关的任务定义。这之后,就可以使用scala任务
了。scalac/fsc的任务与javac任务类似。上面“compile”任务的意思就是,创建一个目标目录(如果不存再),
编译${src.dir}目录下所有的.scala文件。其中,编译使用的classpath在${build.classpath}路径中指定了。
最后的目标"run"用于执行刚才编译好的东西。
阅读(3074) | 评论(0) | 转发(0) |