Ant, 他是一个标准的 java-based Build 小工具, 你也许会问, 我都用 Jbuilder, Eclipse, 或 Netbeans 等等 IDE 工具开发, Compile & Build 都非常轻松, 那么, 还需要 Ant 吗 ?
我的答案一定是肯定的, "需要", 因为你不能保证你的伙伴与客户是否和你用相同的开发工具, 如果不是, 各个 IDE 厂商预设的目录结构都不太相同, 所以 Ant 的 build.xml, 就是成为彼此之间遵循的规范.
SECTION 01 前言
Ant 目前的版本是 1.5.3, 他的下载专区为 http://ant.apache.org/bindownload.cgi , 如果只是使用就可以只下载他的 binary 版本, 如果要查阅源码, 就去抓 source 版本
基本上他现在有提供支持或打算支持的 IDE 工具有 JBuilder, Jext, IDEA, NetBeans, jEdit, Eclipse, VisualAge, WSAD 等等
您可以随时查看 http://ant.apache.org/manual/ide.html , 如果你的 IDE 工具目前还没有提供, 可以过几个月, 或许就会有新的加入.
SECTION 02 安装 Ant
基本上, 使用 Ant 1.x 必需至少要有 JDK 1.1 以上的版本, 当 Ant 2.0 的版本, 将至少需要有 JDK1.2 以上的版本, 你把 binary 的 zip 文件下载下来, 你就解压缩到一个目录(假设 c:/ant or /user/local/ant ), 接著就是设定相关的 PATH,
Win2000/xp 是在系统环境中设置:
ANT_HOME=c:/ant
JAVA_HOME=c:/j2sdk1.4.1
PATH=%PATH%;%ANT_HOME%/bin
UNIX (bash)
export ANT_HOME=/usr/local/ant
export JAVA_HOME=/usr/local/j2sdk-1.4.1
export PATH=${PATH}:${ANT_HOME}/bin
UNIX (csh)
setenv ANT_HOME /usr/local/ant
setenv JAVA_HOME /usr/local/j2sdk-1.4.1
set path=( $path $ANT_HOME/bin )
其实这就是让你可以在所有的目录中都可以执行到 ant 这个指令
SECTION 03 建立 build.xml
我们先来看一个 build.xml ( 直接拿 jtds 0.5.1 的 build.xml ) 来说明 (jtds.sourceforge.net)
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="compile" name="jtds">
<path id="libs">
<fileset dir="lib" includes="*.jar"/>
</path>
<target name="init">
<tstamp/>
<property name="build" value="build"/>
<property name="build.compiler" value="modern"/>
<property name="javac.debug" value="off"/>
<property name="src" value="src"/>
<property name="dist" value="dist"/>
<property name="test" value="test"/>
<property name="version" value="0.5.1"/>
</target>
<target name="clean" depends="init">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
<target name="prepare" depends="init">
<mkdir dir="${build}"/>
<mkdir dir="${build}/classes"/>
<mkdir dir="${build}/src"/>
<copy todir="${build}/src">
<fileset dir="${src}/main" includes="**/*.java"/>
</copy>
<copy todir="${build}/src">
<fileset dir="${src}/test" includes="**/*.java"/>
</copy>
</target>
<target name="compile" depends="init,prepare">
<javac destdir="${build}/classes" srcdir="${build}/src"
classpathref="libs" debug="${javac.debug}"/>
</target>
<target name="javadoc" depends="prepare">
<mkdir dir="${build}/doc"/>
<javadoc sourcepath="${build}/src" destdir="${build}/doc"
packagenames="net.sourceforge.jtds.*" Author="true"
Doctitle="jTDS API Documentation" Use="true"
Version="true" bottom="Generated on ${TODAY}"
Windowtitle="jTDS API" Private="true"/>
</target>
<target name="test" depends="compile">
<taskdef name="junit"
classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"/>
<junit fork="no" haltonfailure="no" printsummary="yes">
<classpath>
<pathelement location="build/classes"/>
<path refid="libs"/>
</classpath>
<formatter type="plain"/>
<batchtest>
<fileset dir="${build}/src">
<include name="**/*Test.java"/>
<exclude name="**/AllTests.java"/>
</fileset>
</batchtest>
</junit>
</target>
<target name="dist" depends="clean,compile,javadoc">
<mkdir dir="${dist}"/>
<!-- Runtime jar only -->
<jar basedir="${build}/classes" excludes="**Test/*" includes="**/*"
jarfile="${dist}/${ant.project.name}-${version}.jar"/>
<!-- Full dist -->
<copy todir="${dist}/tmp/doc">
<fileset dir="${build}/doc" includes="**/*"/>
</copy>
<mkdir dir="${dist}/tmp"/>
<copy todir="${dist}/tmp">
<fileset dir="."
includes="README,CHANGELOG,*.bat,*.xml,jtds.jpx,
*.library,src/**/*,lib/**/*,conf/**/*"/>
</copy>
<zip basedir="${dist}/tmp"
includes="**/*"
zipfile="${dist}/${ant.project.name}-${version}-src.zip"/>
<delete dir="${dist}/tmp"/>
</target>
</project>
通过 JBuilder 看到的画面是
通过 NetBeans 看到的画面是
SECTION 04 project
我们可以看到, project 是 xml 最根元素, 它具有三个属性,
属性 | 说明 | 是否必需 |
name | 项目的名称 | 不是 |
default | 如果直接 build 预设的目标( target ) | 是 |
basedir | 项目的根目录, 通常我们会设为"." | 不是 |
SECTION 05 Targets
Targets 就是规范各种 build 的方式, 例如
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C,B,A"/>
帮我们 ant D 时,执行的先后顺序为 A -> B -> C -> D , 因为 D 要先执行 C, C 要先执行 B, B 要先执行 A, 所以 A 先执行, 而且, 每一个的 target 只会被执行一次, 不管有多少个 target 可能会 depend 他. 所以 A 做完了, 接著是 B , C 做, 最后才是 D
属性 | 说明 | 是否必需 |
name | target 的名称 | 是 |
depends | 用","来作为切割符号, |
是 |
description | 这个 target 的说明 | 不是 |
if | the name of the property that must be set in order for this target to execute. | 不是 |
unless | the name of the property that must not be set in order for this target to execute. | 不是 |
SECTION 06 Tasks
Tasks 就是包装在 target 中间会被执行到的工作项目, 通常是
<name attribute1="value1" attribute2="value2" ... />
也常常会给予他一个 id 识别项
<taskname id="taskID" ... />
详细的工作项目解说及参考请连结 http://ant.apache.org/manual/tasksoverview.html 查阅
SECTION 07 其它
至于其它的如 classpath 等等, 那些复杂度较高, 请自行参阅 tutorial 或书籍, 如果能将 ant 的 build.xml 打包完成, 那么, 你就可以轻易地将 sourcecode 交付给其它人, 不用担心环境的设定会有什么问题, 另外, 当你去下载 opensource 的 sourcecode 时, 也可以轻易地了解他们的编译环境, 该如何去开始工作.