编译源代码
Ant 的 javac 任务的默认行为是调用运行 Ant 本身的任何 JVM 的标准编译器。然而,有时您可能想要单独地调用编译器 ―― 例如当你希望指定编译器的某些内存选项,或者需要使用一种不同级别的编译器的时候。为实现这个目的,只需将 javac 的 fork 属性设置为 true,比如像下面这样:
<javac srcdir="src" fork="true"/> |
如果想要指定一个不同的 javac 可执行文件,并向它传递一个最大内存设置,您可以像下面这样做:
<javac srcdir="src" fork="true" executable="d:/sdk141/bin/javac" memoryMaximumSize="128m"/> |
甚至可以将 Ant 配置为使用某种不同的编译器。受支持的编译器包括开放源代码的 Jikes 编译器和来自 GNU 编译器集(GNU Compiler Collection,GCC)的 GCI 编译器
2. 创建 JAR 文件
<jar destfile="package.jar" basedir="classes"/> |
建清单文件
<jar destfile="package.jar" basedir="classes"> <manifest> <attribute name="Built-By" value="${user.name}"/> <attribute name="Main-class" value="package.Main"/> </manifest> </jar> |
3. 生成时间戳
这种需要是通过简单但是非常有用的 tstamp 任务来解决的。这个任务通常在某次生成过程开始时调用,比如在一个 init 目标中。这个任务不需要属性,许多情况下只需 <tstamp/> 就足够了。
tstamp 设置的属性:
属性 | 说明 | 例子 |
DSTAMP | 设置为当前日期,默认格式为yyyymmdd | 20031217 |
TSTAMP | 设置为当前时间,默认格式为hhmm | 1603 |
TODAY | 设置为当前日期,带完整的月份 | 2003年12月17日 |
将JAR文件将命名为package-20031217.jar
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/> |
还可以配置 tstamp 任务来设置不同的属性,应用一个当前时间之前或之后的时间偏移,或以不同的方式格式化该字符串。所有这些都是使用一个嵌套的 format 元素来完成的,如下所示:
<tstamp> <format property="OFFSET_TIME" pattern="HH:mm:ss" offset="10" unit="minute"/> </tstamp> |
上面的清单将OFFSET_TIME 属性设置为距离当前时间 10分钟之后的小时数、分钟数和秒数。
用于定义格式字符串的字符与 java.text.SimpleDateFormat 类所定义的那些格式字符相同。
4. 综合
面几小节为我们提供了生成简单 Java 项目所需的足够知识。下面将把这些代码片断组合成一个完整的生成文件,它将编译 src 目录下的所有源代码,将结果类文件放在 build 目录下,然后把所有类文件打包到 dist 目录中的一个 JAR 文件中。要自己试验这个生成文件,您所需要的就是包含一个或多个 Java 源代码文件的 src 目录-----这个目录可以包含从简单的“Hell World”程序到来自某个现有项目的大量源文件的任何内容。如果需要向 Java classpath 添加 JAR 文件或其他任何内容,以便成功地编译源代码,您只需在 javac 任务中为其添加一个 classpath 属性。
该生成文件看起来如下:
<?xml version="1.0"?> <project default="dist" name="Project Argon"> <description>A simple Java project</description> <property name="srcDir" location="src"/> <property name="buildDir" location="build"/> <property name="distDir" location="dist"/> <target name="init"> <tstamp/> <mkdir dir="${buildDir}"/> <mkdir dir="${distDir}"/> </target> <target name="compile" depends="init"> <javac srcdir="${srcDir}" destdir="${buildDir}"/> </target> <target name="dist" depends="compile"> <jar destfile="${distDir}/package-${DSTAMP}.jar" basedir="${buildDir}"> <manifest> <attribute name="Built-By" value="${user.name}"/> <attribute name="Main-Class" value="package.Main"/> </manifest> </jar> <jar destfile="${distDir}/package-src-${DSTAMP}.jar" basedir="${srcDir}"/> </target> <target name="clean"> <delete dir="${buildDir}"/> <delete dir="${distDir}"/> </target> </project> |
5. 创建和删除目录
<mkdir dir="archive/metals/zinc"/>
<delete dir="archive/metals/zinc"/>
|
6. 复制和移动文件及目录
也相当于重命名: <copy file="src/Test.java" tofile="src/TestCopy.java"/> 移动到另一个目录: <copy file="src/Test.java" todir="archive"/> <move file="src/Test.java" todir="archive"/> |
7. 创建和解压缩 zip 及 tar 文件
下面是创建 zip 文件的 Ant 任务:
<zip destfile="output.zip" basedir="output"/> |
相同的语法也可用于创建 tar 文件。 还可以使用 GZip 和 BZip 任务来压缩文件。例如:
<gzip src="/developerWorks/education/java/j-apant/tutorial/output.tar" zipfile="output.tar.gz"/> |
解压缩和提取文件同样也很简单:
<unzip src="/developerWorks/cn/education/java/j-apant/tutorial/output.tar.gz" dest="extractDir"/> |
还可以包括 overwrite 属性来控制覆盖行为。默认设置是覆盖与正在被提取的归档文件中的条目相匹配的所有现有文件。相关的任务名称是 untar、unjar、gunzip 和 bunzip。
8. 替换文件中的标记
token 属性指定要查找的字符串,value 属性指定一个新的字符串
<replace file="input.txt" token="old" value="new"/> |
9. 模式匹配
*,它匹配零个或多个字符;以及?,它仅匹配一个字符;**,它匹配任意数量的目录。
例:src*/*.java 将匹配带 src 前缀的任何目录中的所有 Java 文件;
模式 **/*.java 将匹配当前目录结构下的所有 Java 文件。
<copy todir="archive"> <fileset dir="src"> <include name="*.java"/> </fileset> </copy> |
10. 使用选择器
Ant 可用的核心选择器的列表:
• size:这个选择器用于根据文件的字节大小选择文件(除非使用 units 属性来指定了不同的单位)。when 属性用于设置比较的性质(less、more 或者 equal),value 属性定义每个文件将与之作比较的目标大小。
• contains:只有包含给定文本字符串(由text 属性指定)的文件才匹配这个选择器。默认情况下,查找操作是大小写敏感的;添加casesensitive="no" 可以改变默认设置。
• filename:name 属性指定文件名要与之匹配的模式。它本质上与 include 元素相同,以及与指定了negate="yes" 时的 exclude 元素相同。
• present:从当前目录结构中选择如下文件:它们与指定的 targetdir 目录中的文件具有相同的名称和相对目录结构。
• depend:这个选择器与 present 选择器具有相同的效果,只不过匹配的文件被限制到相对于 targetdir 位置中的对应文件来说,最近已修改过的那些文件。
• date:这个选择器基于其最后修改日期选择文件。when 属性指定作比较的性质是 before、after 还是 equal,datetime 属性指定与之作比较的日期和时间,这个日期和时间具有给定的固定格式 MM/DD/YYYY HH:MM AM_or_PM。注意 Windows 平台上有一个内置的 2 秒偏移,以允许底层文件系统的不精确性 ―― 这可能导致匹配的文件数量超过预期。允许的回旋时间量可以使用 granularity 属性来更改(以毫秒为单位来指定)。
• depth:这个选择器检查每个文件的目录结构层次数目。min 和/或 max 属性用于选择具有想要的目录层次数目的的文件。
还可以通过在一个选择器 容器 内嵌套一个或多个选择器来组合选择器。 最常用的选择器容器 and 仅选择它包含的所有选择器都选择了的文件。其他选择其容器包括 or、not、none 和 majority。
下面是一个文件集的例子,它仅选择那些大于 512 字节并且包含字符串“hello”的文件。
<fileset dir="dir"> <and> <contains text="hello"/> <size value="512" when="more"/> </and> </fileset> |
11. 将生成文件链接起来
两种生成大型项目的不同方法。一种是让一个单一的生成文件做所有事情;另一种是让高级别的生成文件调用其它生成文件以执行特定任务,从而将生成过程划分为许多较小的部分。
使用 ant 任务来从一个 Ant 生成中调用另一个 Ant 生成是很容易的。在简单的情况下,您可以使用 antfile 属性,仅指定那些要使用的生成文件,Ant 将生成该生成文件中的默认目标。例如:
<ant antfile="sub-build.xml"/> |
在父生成文件中定义的任何属性默认将传递给子生成文件,虽然这可以通过指定 inheritAll="false"来避免。通过使用 property 元素来传入显式的属性也是可以做到的 ―― 即使将 inheritAll 设置为 false,这些属性也仍然适用于子生成文件。这个功能很适合用于给子生成文件传入参数。
让我们来考虑一个例子。下面是我们想要调用的一个生成文件:
<?xml version="1.0"?> <project default="showMessage"> <target name="showMessage"> <echo message="Message=${message}"/> </target> </project> (echo 任务 ―― 它简单地输出给定的消息。) 下面是调用第一个生成文件的第二生成文件,它还给第一个生成文件传入 message 属性: <?xml version="1.0"?> <project default="callSub"> <target name="callSub"> <ant antfile="sub.xml" target="showMessage" inheritAll="false"> <property name="message" value="Hello from parent build"/> </ant> </target> </project> 运行第二个生成文件所得到的输出如下: Buildfile: build.xml callSub: showMessage: [echo] Message=Hello from parent build BUILD SUCCESSFUL Total time: 0 seconds |
12. 使用 CVS 知识库
从 CVS 知识库提取模块的一个例子生成文件:
<?xml version="1.0"?> <project name="CVS Extract" default="extract" basedir="."> <property name="cvsRoot" value=":pserver:anonymous@dev.eclipse.org:/home/eclipse"/> <target name="extract"> <cvs cvsRoot="${cvsRoot}" package="org.eclipse.swt.examples" dest="${basedir}"/> </target> </project> |
cvs 任务的主要属性是 cvsRoot,它是对 CVS 知识库的完整引用,包括连接方法和用户详细信息。这个参数的格式如下:
[:method:][[user][:password]@]hostname[:[port]]/path/to/repository
转自IBM
从 CVS 知识库提取模块的一个例子生成文件:
12. 使用 CVS 知识库
两种生成大型项目的不同方法。一种是让一个单一的生成文件做所有事情;另一种是让高级别的生成文件调用其它生成文件以执行特定任务,从而将生成过程划分为许多较小的部分。
11. 将生成文件链接起来
Ant 可用的核心选择器的列表:
*,它匹配零个或多个字符;以及?,它仅匹配一个字符;**,它匹配任意数量的目录。
token 属性指定要查找的字符串,value 属性指定一个新的字符串
7. 创建和解压缩 zip 及 tar 文件
6. 复制和移动文件及目录
面几小节为我们提供了生成简单 Java 项目所需的足够知识。下面将把这些代码片断组合成一个完整的生成文件,它将编译 src 目录下的所有源代码,将结果类文件放在 build 目录下,然后把所有类文件打包到 dist 目录中的一个 JAR 文件中。要自己试验这个生成文件,您所需要的就是包含一个或多个 Java 源代码文件的 src 目录-----这个目录可以包含从简单的“Hell World”程序到来自某个现有项目的大量源文件的任何内容。如果需要向 Java classpath 添加 JAR 文件或其他任何内容,以便成功地编译源代码,您只需在 javac 任务中为其添加一个 classpath 属性。
4. 综合
3. 生成时间戳