1.4 在Ant中编译Java代码

来源:互联网 发布:阿里云短信模板 编辑:程序博客网 时间:2024/06/06 10:45

1.4  在Ant中编译Java代码

原文:http://book.51cto.com/art/201001/177825.htm

在Java开发中,任何构建脚本都需要完成的一个最基本工作就是编译代码。在Ant中,<javac>任务为编译Java代码提供了方便的一次性解决方案。

下面介绍<javac>任务的简单用法。以上示例中使用了这一任务的简单形式来编译src/main目录中的Java类,并将编译好的类放入build/classes目录中:

  1. <target name="compile" depends="init" description="Compile Java code">
  2. <javac srcdir="src" destdir="build/classes"/>
  3. </target>

这相当于用javac工具执行以下命令:

  1. $ javac -nowarn -d build/classes src/main

不可否认,在现实世界中,极少会编译如此简单的应用程序。在大多数实际应用程序中,应用程序将要编译和运行一组程序库。在Ant项目中,这些程序库通常存储在lib目录中。在编译应用程序时,需要告诉Ant到哪里去找到这些程序库。

Ant提供了一些非常强大的功能来帮助用户完成这一工作。Ant擅长定义和操作“类路径(path-like)”以及其他文件路径定义。在Ant中,这些定义称为“类似于路径”的结构,除了最不重要的创建文件,它们在所有创建文件中被广泛使用。最简单的形式是在<path>标签中使用location属性来标识特定程序库。

  1. <path id="junit.classpath" location="lib/junit.jar"/>

还可以使用path属性以相同的方式定义该路径。不过,除了定义单个JAR文件或目录,还可以利用path属性,通过组合目录路径和JAR文件来使用更类似于路径的构造,如下所示:

  1. <path id="junit.classpath" path="build/classes:lib/junit.jar"/>

Ant的路径处理功能的好处之一是路径(与底层Java API一样)可以在不同操作系统间移植。按照惯例,这里使用包含正斜杠(“/”)的Unix样式的路径。例如,在Windows计算机上,Ant会自动将以上路径解释为“build\classes;lib\junit.jar”。

尽管这有助于编写更易读的构建文件,但只有在需要操作大量文件时,Ant路径处理功能的真正好处才会发挥出来。以下示例创建了一个包括lib目录中所有jar文件的路径定义:

  1. <path id="compile.classpath">
  2. <fileset dir="lib" includes="*.jar" />
  3. </path>

在为现实Java构建文件定义类路径时,经常需要进行这类操作,如下所示,可以在<javac>任务中通过classpathref属性来使用这类路径:

  1. <target name="compile" depends="init" description="Compile Java code">
  2. <javac srcdir="src"
  3.   destdir="build/classes"
  4.   classpathref="compile.classpath" />
  5. </target>

如果认为在构建文件的其他位置将不需要此类路径,可以将<classpath>元素直接嵌入在<javac>任务中:

  1. <target name="compile" depends="init" description="Compile Java code">
  2. <javac srcdir="src" destdir="build/classes">
  3. <classpath>
  4. <fileset dir="lib" includes="*.jar"/>
  5. </classpath>
  6. </javac>
  7. </target>

为了方便,这些路径实际上使用了简化表示。为了更加易读,也可以使用嵌入标签,在需要许多不同的类路径元素时这会有用。如果要想重用在构建文件的其他位置定义的路径,这也很方便。利用<pathelement>标签,可使用JAR文件、目录或者甚至是另一个类路径元素的引用来定义类路径元素:

  1. <path id="test.classpath">
  2. <path refid="compile.classpath"/>
  3. <pathelement location="lib/junit.jar"/>
  4. <pathelement path="build/test-classes"/>
  5. </path>

还可以在<javac>任务本身中通过includes和excludes属性使用类似于路径的表达式,告诉Ant在编译过程中包括哪些类或从中排除哪些类。例如,要只编译com.mycompany. myapp.web软件包中(及其之下)的类,可以使用以下命令:

  1. <javac srcdir="src" destdir="build/classes" includes="com/mycompany/myapp/web/**" />

在编译Java代码时,经常要为特定Java版本进行编译。例如,用户可能在开发计算机上使用Java 6,但需要将代码部署到只支持Java 1.4的环境中,通过将source属性设置为“1.4”,可以确保自己的Java代码与Java 1.4兼容,而不使用Java 5语法。同样,通过将target属性指定为“1.4”,可以告诉Ant生成与Java 1.4 JVM字节兼容的代码。

  1. <javac srcdir="src" destdir="build/classes" source="1.4" target="1.4" />

有时还需要表明是否想在编译源代码时生成调试信息,这一功能默认是关闭的,但在测试和调试代码时,它可能会派上用场。要打开这一选项,将debug属性设置为on(或true):

  1. <javac srcdir="src" destdir="build/classes" debug="on" />

尽管名称相同,但<javac>任务并不依赖名称也为javac的标准Sun Java编译器。事实上,通过指定compiler属性,其他编译器如Jikes和GCJ的爱好者可以使用这些编译器或许多其他更特殊的选择:

  1. <javac srcdir="src" destdir="build/classes" compiler="jikes"/>

还可以通过设置build.compiler属性(参见第1.5节)为整个构建文件定义该值。

可以看到,<javac>任务为编译Java代码提供了强大灵活的工具,这里介绍的许多技术对于很多Ant任务都很典型,后面将看到应用这些技术的更多例子。

原创粉丝点击