Junky's IT Notebook

统计

留言簿(8)

积分与排名

WebSphere Studio

阅读排行榜

评论排行榜

Ant全攻略

转自: BEA 论坛 powerise  
1.Ant
是什么?

Ant
是一种基于 Java XML build 工具。


2
下载、安装 Ant
安装
Ant
下载 .zip 文件,解压缩到 c:\ant1.3( 后面引用为
%ANT_HOME%)

2.1
在你运行 Ant 之前需要做一些配置工作。

·
bin 目录加入 PATH 环境变量。
·
设定 ANT_HOME 环境变量,指向你安装 Ant 的目录。在一些 OS 上, Ant 的脚本可以猜测 ANT_HOME Unix Windos NT/2000 )-但最好不要依赖这一特性。

·
可选地,设定 JAVA_HOME 环境变量(参考下面的高级小节),该变量应该指向你安装 JDK 的目录。
注意:不要将 Ant ant.jar 文件放到 JDK/JRE lib/ext 目录下。 Ant 是个应用程序,而 lib/ext 目录是为 JDK 扩展使用的(如 JCE JSSE 扩展)。而且通过扩展装入的类会有安全方面的限制。
2.2
运行 Ant

运行 Ant 非常简单,当你正确地安装 Ant 后,只要输入 ant 就可以了。


n
没有指定任何参数时, Ant 会在当前目录下查询 build.xml 文件。如果找到了就用该文件作为 buildfile 。如果你用 -find 选项。 Ant 就会在上级目录中寻找 buildfile ,直至到达文件系统的根。要想让 Ant 使用其他的 buildfile ,可以用参数 -buildfile file ,这里 file 指定了你想使用的 buildfile

n
可以指定执行一个或多个 target 。当省略 target 时, Ant 使用标签 <project> default 属性所指定的 target


命令行选项总结:
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile file use given file for log output
-logger classname the class that is to perform logging
-listener classname add an instance of class as a project listener
-buildfile file use specified buildfile
-find file search for buildfile towards the root of the filesystem and use the first one found
-Dproperty=value set property to value
例子
ant
使用当前目录下的 build.xml 运行 Ant ,执行缺省的 target
ant -buildfile test.xml
使用当前目录下的 test.xml 运行 Ant ,执行缺省的 target
ant -buildfile test.xml dist
使用当前目录下的 test.xml 运行 Ant ,执行一个叫做 dist target
ant -buildfile test.xml -Dbuild=build/classes dist
使用当前目录下的 test.xml 运行 Ant ,执行一个叫做 dist target ,并设定 build 属性的值为 build/classes

3
编写 build.xml

Ant
buildfile 是用 XML 写的。每个 buildfile 含有一个 project


buildfile
中每个 task 元素可以有一个 id 属性,可以用这个 id 值引用指定的任务。这个值必须是唯一的。(详情请参考下面的 Task 小节)

3.1 Projects

project
有下面的属性:
Attribute Description Required
name
项目名称 . No
default
当没有指定 target 时使用的缺省
target Yes
basedir
用于计算所有其他路径的基路径。该属性可以被 basedir property 覆盖。当覆盖时,该属性被忽略。如果属性和 basedir property 都没有设定,就使用 buildfile 文件的父目录。
No
项目的描述以一个顶级的 <description> 元素的形式出现(参看 description 小节)。


一个项目可以定义一个或多个 target 。一个 target 是一系列你想要执行的。执行 Ant 时,你可以选择执行那个 target 。当没有给定 target 时,使用 project default 属性所确定的 target

3.2 Targets

一个 target 可以依赖于其他的 target 。例如,你可能会有一个 target 用于编译程序,一个 target 用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的 target 依赖于编译 target Ant 会处理这种依赖关系。

然而,应当注意到, Ant depends 属性只指定了 target 应该被执行的顺序-如果被依赖的 target 无法运行,这种 depends 对于指定了依赖关系的 target 就没有影响。

Ant
会依照 depends 属性中 target 出现的顺序(从左到右)依次执行每个 target 。然而,要记住的是只要某个 target 依赖于一个 target ,后者就会被先执行。
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定我们要执行 target D 。从它的依赖属性来看,你可能认为先执行 C ,然后 B ,最后 A 被执行。错了, C 依赖于 B B 依赖于 A ,所以先执行 A ,然后 B ,然后 C ,最后 D 被执行。

一个 target 只能被执行一次,即时有多个 target 依赖于它(看上面的例子)。

如果(或如果不)某些属性被设定,才执行某个 target 。这样,允许根据系统的状态( java version, OS, 命令行属性定义等等)来更好地控制 build 的过程。要想让一个 target 这样做,你就应该在 target 元素中,加入 if (或 unless )属性,带上 target 因该有所判断的属性。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果没有 if unless 属性, target 总会被执行。

可选的 description 属性可用来提供关于 target 的一行描述,这些描述可由 -projecthelp 命令行选项输出。

将你的 tstamp task 在一个所谓的初始化 target 是很好的做法,其他的 target 依赖这个初始化 target 。要确保初始化 target 是出现在其他 target 依赖表中的第一个 target 。在本手册中大多数的初始化 target 的名字是 "init"

target
有下面的属性:
Attribute Description Required
name target
的名字 Yes
depends
用逗号分隔的 target 的名字列表,也就是依赖表。
No
if
执行 target 所需要设定的属性名。
No
unless
执行 target 需要清除设定的属性名。
No
description
关于 target 功能的简短描述。
No

3.3 Tasks

一个 task 是一段可执行的代码。


一个 task 可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对 property 的引用。这些引用会在 task 执行前被解析。

下面是 Task 的一般构造形式:
<name attribute1="value1" attribute2="value2" ... />
这里 name task 的名字, attributeN 是属性名, valueN 是属性值。

有一套内置的( built-in task ,以及一些可选 task ,但你也可以编写自己的 task

所有的 task 都有一个 task 名字属性。 Ant 用属性值来产生日志信息。

可以给 task 赋一个 id 属性:
<taskname id="taskID" ... />
这里 taskname task 的名字,而 taskID 是这个 task 的唯一标识符。通过这个标识符,你可以在脚本中引用相应的 task 。例如,在脚本中你可以这样:
<script ... >
task1.setFoo("bar");
</script>
设定某个 task 实例的 foo 属性。在另一个 task 中(用 java 编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意 1 :如果 task1 还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

注意 2 :未来的 Ant 版本可能不会兼容这里所提的属性,因为很有可能根本没有 task 实例,只有 proxies

3.4 Properties

一个 project 可以有很多的 properties 。可以在 buildfile 中用 property task 来设定,或在 Ant 之外设定。一个 property 有一个名字和一个值。 property 可用于 task 的属性值。这是通过将属性名放在 "${" "}" 之间并放在属性值的位置来实现的。例如如果有一个 property builddir 的值是 "build" ,这个 property 就可用于属性值: ${builddir}/classes 。这个值就可被解析为 build/classes

内置属性

如果你使用了 <property> task 定义了所有的系统属性, Ant 允许你使用这些属性。例如, ${os.name} 对应操作系统的名字。

要想得到系统属性的列表可参考 the Javadoc of System.getProperties

除了 Java 的系统属性, Ant 还定义了一些自己的内置属性:
basedir project
基目录的绝对路径 ( <project> basedir 属性一样 )

ant.file buildfile
的绝对路径。
ant.version Ant
的版本。
ant.project.name
当前执行的 project 的名字;由 <project> name 属性设定 .
ant.java.version Ant
检测到的 JVM 的版本; 目前的值有
"1.1", "1.2", "1.3" and "1.4".
   
例子

<project name="MyProject" default="dist" basedir=".">

<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
   
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
 
<target name="compile" depends="init">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>

<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>

<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>

</project>

3.5 Path-like Structures

你可以用 ":" ";" 作为分隔符,指定类似 PATH CLASSPATH 的引用。 Ant 会把分隔符转换为当前系统所用的分隔符。

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location
属性指定了相对于 project 基目录的一个文件和目录,而 path 属性接受逗号或分号分隔的一个位置列表。 path 属性一般用作预定义的路径--其他情况下,应该用多个 location 属性。

为简洁起见, classpath 标签支持自己的 path location 属性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被简写作:
<classpath path="${classpath}"/>
也可通过 <fileset> 元素指定路径。构成一个 fileset 的多个文件加入 path-like structure 的顺序是未定的。
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子构造了一个路径值包括: ${classpath} 的路径,跟着 lib 目录下的所有 jar 文件,接着是 classes 目录。

如果你想在多个 task 中使用相同的 path-like structure ,你可以用 <path> 元素定义他们(与 target 同级),然后通过 id 属性引用--参考 Referencs 例子。

path-like structure
可能包括对另一个 path-like structurede 的引用(通过嵌套 <path> 元素):
<path id="base.path">
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
前面所提的关于 <classpath> 的简洁写法对于 <path> 也是有效的,如:
<path id="tests.path">
  <path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
可写成:
<path id="base.path" path="${classpath}"/>
命令行变量

有些 task 可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的 arg 元素。
Attribute Description Required
value
一个命令行变量;可包含空格字符。 只能用一个
line
空格分隔的命令行变量列表。
file
作为命令行变量的文件名;会被文件的绝对名替代。

path
一个作为单个命令行变量的 path-like 的字符串;或作为分隔符, Ant 会将其转变为特定平台的分隔符。


例子

<arg value="-l -a"/>
是一个含有空格的单个的命令行变量。
<arg line="-l -a"/>
是两个空格分隔的命令行变量。
<arg path="/dir;/dir2:\dir3"/>
是一个命令行变量,其值在 DOS 系统上为 \dir;\dir2;\dir3 ;在 Unix 系统上为 /dir:/dir2:/dir3

3.6 References

buildfile
元素的 id 属性可用来引用这些元素。如果你需要一遍遍的复制相同的 XML 代码块,这一属性就很有用--如多次使用 <classpath> 结构。

下面的例子:
<project ... >
<target ... >   
<rmic ...>     
<classpath>       
<pathelement location="lib/"/>       
<pathelement path="${java.class.path}/"/>       
<pathelement path="${additional.path}"/>     
</classpath>   
</rmic> 
</target>
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
</project>
可以写成如下形式:
<project ... >
<path id="project.class.path"> 
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>  
<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
<target ... >
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
所有使用 PatternSets, FileSets path-like structures 嵌套元素的 task 也接受这种类型的引用。
================================================================

                               Ant
全攻略(续)--- Ant 中的内置任务

4.1 File
Directory )类
4.1.1 Mkdir
n
创建一个目录,如果他的父目录不存在,也会被同时创建。
n
例子:
<mkdir dir="build/classes"/>
n
说明: 如果 build 不存在,也会被同时创建
4.1.2 Copy
n
拷贝一个(组)文件、目录
n
例子:
1.
拷贝单个的文件:
<copy file="myfile.txt" tofile="mycopy.txt"/>
2.
拷贝单个的文件到指定目录下

<copy file="myfile.txt" todir="../some/other/dir"/>
3.
拷贝一个目录到另外一个目录下
  <copy todir="../new/dir">
    <fileset dir="src_dir"/>
  </copy>
4.
拷贝一批文件到指定目录下
  <copy todir="../dest/dir">
    <fileset dir="src_dir">
      <exclude name="**/*.java"/>
    </fileset>
  </copy>

  <copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
  </copy>
5.
拷贝一批文件到指定目录下,将文件名后增加。 Bak 后缀
  <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <mapper type="glob" from="*" to="*.bak"/>
  </copy>
6.
拷贝一组文件到指定目录下,替换其中的 @ 标签 @ 内容
  <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
      <filter token="TITLE" value="Foo Bar"/>
    </filterset>
  </copy>
4.1.3 Delete
n
删除一个(组)文件或者目录
n
例子
1.
删除一个文件
<delete file="/lib/ant.jar"/>
2.
删除指定目录及其子目录
  <delete dir="lib"/>
3.
删除指定的一组文件
  <delete>
    <fileset dir="." includes="**/*.bak"/>
  </delete>
4.
删除指定目录及其子目录,包括他自己
  <delete includeEmptyDirs="true">
    <fileset dir="build"/>
  </delete>
4.1.4 Move
n
移动或重命名一个(组)文件、目录
n
例子:
1.
移动或重命名一个文件
<move file="file.orig" tofile="file.moved"/>
2.
移动或重命名一个文件到另一个文件夹下面
<move file="file.orig" todir="dir/to/move/to"/>
3.
将一个目录移到另外一个目录下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4.
将一组文件移动到另外的目录下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5.
移动文件过程中增加。 Bak 后缀
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>

  ================================================================
                                             Ant
全攻略   --  Java 相关任务

4.2.1 Javac
n
编译 java 原代码
n
例子
1. <javac srcdir="${src}"
         destdir="${build}"
         classpath="xyz.jar"
         debug="on"
  />
编译 ${src} 目录及其子目录下的所有。 Java 文件,。 Class 文件将放在 $ build }指定的目录下, classpath 表示需要用到的类文件或者目录, debug 设置为 on 表示输出 debug 信息
2. <javac srcdir="${src}:${src2}"
         destdir="${build}"
         includes="mypackage/p1/**,mypackage/p2/**"
         excludes="mypackage/p1/testpackage/**"
         classpath="xyz.jar"
         debug="on"
  />
编译 ${src} ${src2} 目录及其子目录下的所有。 Java 文件,但是 package/p1/**,mypackage/p2/** 将被编译,而 mypackage/p1/testpackage/** 将不会被编译。 Class 文件将放在 $ build }指定的目录下, classpath 表示需要用到的类文件或者目录, debug 设置为 on 表示输出 debug 信息
3. <property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>

<javac srcdir="${src}"
         destdir="${src}"
classpath="${classpath}"
debug="on"
/>
路径是在 property 中定义的
4.2.2 java
n
执行指定的 java
n
例子:
1. <java classname="test.Main">
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
classname
中指定要执行的类, classpath 设定要使用的环境变量
2. <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
  </path>

  <target ... >
    <rmic ...>
      <classpath refid="project.class.path"/>
    </rmic>
  </target>

================================================================

                                       Ant 全攻略   --     通过 JDBC 执行 SQL 语句

4.5
执行 SQL 语句

n
通过 jdbc 执行 SQL 语句
n
例子:
1. <sql
    driver="org.gjt.mm.mysql.Driver"
    url="jdbc:mysql://localhost:3306/mydb"
    userid="root"
    password="root"
    src="data.sql"
/>
2. <sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass"
    src="data.sql"
    rdbms="oracle"
    version="8.1."
    >
</sql>
只有在 oracle 、版本是 8.1 的时候才执行

================================================================
                                        Ant
全攻略之   ---   发送邮件

4.6
发送邮件
n
使用 SMTP 服务器发送邮件
n
例子:
<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
  <from address="me@myisp.com"/>
  <to address="all@xyz.com"/>
  <message>The ${buildname} nightly build has completed</message>
  <fileset dir="dist">
    <includes name="**/*.zip"/>
  </fileset>
</mail>
l mailhost
SMTP 服务器地址
l mailport
服务器端口
l subject
  主题
l from
    发送人地址
l to
      接受人地址
l message
发送的消息
l fileset
  设置附件

posted on 2006-12-31 11:37 junky 阅读(336) 评论(0)  编辑  收藏 所属分类: ant


只有注册用户登录后才能发表评论。


网站导航: