Apache Ant

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 时, 也可以轻易地了解他们的编译环境, 该如何去开始工作.

你可能感兴趣的:(Apache Ant)