Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1090924
  • 博文数量: 104
  • 博客积分: 3715
  • 博客等级: 中校
  • 技术积分: 1868
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-30 08:38
文章分类

全部博文(104)

文章存档

2013年(1)

2012年(9)

2011年(41)

2010年(3)

2009年(3)

2008年(47)

分类: Java

2011-05-05 08:58:43

当一个工程中源文件越来越多的时候,我们可以使用一个构建工具,方便的对整个工程进行构建。在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的例子:
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <project name="HelloWorld" default="compile">

  3. <!-- global properties -->
  4. <property name="scala.home"
  5.           value="/home/liangkun/programs/scala28" />
  6. <property name="scala.library"
  7.           value="${scala.home}/lib/scala-library.jar" />
  8. <property name="src.dir"
  9.           value="${basedir}/src" />
  10. <property name="build.dir"
  11.           value="${basedir}/build" />

  12. <!-- class path settings -->
  13. <path id="build.classpath">
  14.     <pathelement location="${build.dir}" />
  15.     <pathelement location="${scala.library}" />
  16. </path>

  17. <!-- define scalac, fsc, sbaz ... tasks -->
  18. <target name="scala.tasks">
  19.     <taskdef resource="scala/tools/ant/antlib.xml">
  20.         <classpath>
  21.             <pathelement location="${scala.home}/lib/scala-compiler.jar" />
  22.             <pathelement location="${scala.library}" />
  23.         </classpath>
  24.     </taskdef>
  25. </target>

  26. <target name="compile" depends="scala.tasks">
  27.       <mkdir dir="${build.dir}" />
  28.       <fsc srcdir="${src.dir}"
  29.            destdir="${build.dir}"
  30.            classpathref="build.classpath">
  31.            <include name="**/*.scala" />
  32.       </fsc>
  33. </target>

  34. <!-- run the program -->
  35. <target name="run" depends="compile">
  36.     <java classname="HelloWorld"
  37.           classpathref="build.classpath" />
  38. </target>

  39. </project>
      在上面,“scala.tasks”这个target用于为ant引入scala相关的任务定义。这之后,就可以使用scala任务
了。scalac/fsc的任务与javac任务类似。上面“compile”任务的意思就是,创建一个目标目录(如果不存再),
编译${src.dir}目录下所有的.scala文件。其中,编译使用的classpath在${build.classpath}路径中指定了。

      最后的目标"run"用于执行刚才编译好的东西。
阅读(3074) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~