ant使用指南

一、概述

ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。

 

开发环境:

System:Windows

JDK:1.6+

IDE:eclipse

ant:1.9.1

 

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

 

二、优点

ant 是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点: 
1、跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。 
2、操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。 
3、维护简单、可读性好、集成简单:由于Ant构建文件 时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。

 

三、安装和配置

1、下载ant,http://mirror.esocc.com/apache//ant/binaries/apache-ant-1.9.1-bin.zip

2、解压zip压缩包,将压缩包放置你要放置的目录。我这里放置在D:\apache-ant-1.9.1,目录结构如下:

image

bin是ant的程序运行入口,如果没有配置ANT_HOME的情况下,可以通过bin目录中的bat程序进行运行build任务。

如:在cmd中运行ant.bat就可以执行程序,当然你选择要当前目录中存在一个build.xml(build.xml是默认的ant执行文件,当然你可以指定其他文件)

image

etc目录中存放的都是一些xsl的输出模板,创建一个加强的导出各种任务的XML输出,使你的build文件摆脱过时的警告

lib目录中存放的是ant程序需要依赖的jar包

manual目录是ant程序的帮助文档

3、在我的电脑 –> 右键属性 –> 高级系统配置 -> 环境变量 中配置ant

新建系统变量 ANT_HOME = D:\apache-ant-1.9.1

image

这样环境变量就配置好了,但前提你需要配置jdk的环境变量。如果你没有配置jdk的环境变量,那么请你先配置好jdk变量。jdk环境配置方法如下:

(1),安装JDk到其默认目录:C:\Program Files\Java\jdk1.5.0_05 (没有jdk去官方下载一个) 
C:\Program Files\Java\jdk1.5.0 
作用:告诉系统JVM在什么地方

(2),右击我的电脑,选属性,高级,环境变量 
(3),在系统变量栏点新建,出现新建系统变量对话框,在变量名中填上JAVA_HOME ,变量值:C:\Program Files\Java\jdk1.5.0_05 
(4),确定后在系统变量(S)栏再新建一个环境变量CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(开头的dot和;不能少) 
(5),确定后在系统变量(S)栏查找并选中变量为Path的选项,点编辑在变量值(V)的末尾添加: 
%JAVA_HOME%\bin     

如果没有找到PATH变量,自己新建一个! 
如果你不想每次运行都要cmd到class所在目录然后执行java命令,可以把所有的class文件放到统一的目录组织下,然后将此目录也追加到CLASSPATH下。

测试代码如下:

public class Test { 
    public static void main(String[] args) { 
              System.out.println("Hello World!"); 
    } 
}

用记事本编辑后存为Test.java(文件名与类名相同)文件,打开命令行窗口, 
cd到文件所在目录下: 
javac Test.java                       //编译命令 
java Test                                //执行程序 
如果输出为:Hello World!       OK,配置完毕,否则,重新检查。

 

四、测试ant

在启动,运行cmd的dos窗口中输入ant,如图:

image

如果出现这个,那么恭喜你安装成功了!否则就失败了,检查下前面的步骤有没有错误。上面命令会执行ant程序,ant默认执行build.xml中的任务,这里在Administrator目录中没有这个文件。

如果安装失败,你看看是否存在一些情况:

1、没有配置JAVA_HOME 或配置错误,并且JAVA_HOME\bin\java.exe存在

2、没有配置ANT_HOEM 或配置错误,并且ANT_HOME\bin\ant.bat存在

3、检查你的环境变量的path变量中,有木有配置...;%ANT_HOME%\bin;...

%PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries... 

 

五、ant的运行时环境

ant在运行命令的时候,有时候会出现一些公园的jar库。这些库会存在于每个ant工程中,那么这个时候我们可以把这个jar包放到ant_home\lib目录中作为全局的库使用。

如果你不想“污染”原始的ant程序,那么你可以把jar包放在当前windows用户的目录下,具体位置应该是${user.home}/.ant/lib 下。没有以上目录可以手动建立。

如果你只是临时要添加lib,又不想把lib添加到当前ant工程中。你可以在运行ant程序的时候指定依赖的lib参数。

image

同时,你还可以在当前build工程的classpath目录中添加你的工程依赖jar包。

六、ant命令

image

语法元素说明如下: 
-help 
显示描述ant 命令及其选项的帮助信息 
-projecthelp 
显示包含在构建文件中的、所有用户编写的帮助文档。即为各个<target>中description 属性的文本,以及包含在<description>元素中的任何文本。将有description 属性的目标列为主目标(Main target),没有此属性的目标则列为子目标(Subtarget)。 
-version 
要求ant 显示其版本信息,然后退出。 
-quiet 
抑制并非由构建文件中的echo 任务所产生的大多数消息。 
-verbose 
显示构建过程中每个操作的详细消息。此选项与-debug 选项只能选其一。 
-debug 
显示Ant 和任务开发人员已经标志为调试消息的消息。此选项与-verbose 只能选其一。 
-emacs 
对日志消息进行格式化,使它们能够很容易地由Emacs 的shell 模式(shellmode)所解析;也就是说,打印任务事件,但并不缩排,在其之前也没有[taskname]。 
-logfile filename 
将日志输出重定向到指定文件。 
-logger classname 
指定一个类来处理Ant 的日志记录。所指定的类必须实现了org.apache.tools.ant.BuildLogger 接口。 
-listener classname 
为Ant 声明一个监听类,并增加到其监听者列表中。在Ant与IDE或其他Java程序集成时,此选项非常有用。可以阅读第六章以了解有关监听者的更多信息。必须将所指定的监听类编写为可以处理Ant 的构建消息接发。 
-buildfile filename 
指定Ant 需要处理的构建文件。默认的构建文件为build.xml。 
-Dproperty=value 
在命令行上定义一个特性名-值对。 
-find filename 
指定Ant 应当处理的构建文件。与-buildfile 选项不同,如果所指定文件在当前目录中未找到,-find 就要求Ant 在其父目录中再进行搜索。这种搜索会继续在其祖先目录中进行,直至达到文件系统的根为止,在此如果文件还未找到,则构建失败。 
-atuoproxy jdk1.5以上的可以使用代理设置 
-nouserlib 运行ant时不使用用户lib中的jar包 
-nice 设计主线程优先级 
-logfile 使用指定的log日志 
-noinput 不允许交互输入 
-keep-going, -k 执行不依赖于所有目标 
-propertyfile 加载所有属性配置文件 -d 属性文件优先

<project default="all">
    <property name="pro_a" value="a value" />
    <property name="pro_b" value="b value" />
    
    <path id="rt.path">
        <pathelement location="${java.home}/jre/lib/rt.jar" />
    </path>
    
    <target name="all">
        <javac srcdir=".">
            <classpath refid="a.path" />
        </javac>
    </target>
</project>

注意: 
● 所有构建文件都要有<project>元素,而且至少有一个<target> 元素。 
● 对于<project> 元素的default 属性并不一定需要默认值。 
● 构建文件并不一定要被命名为build.xml。不过build.xml 是ant 要搜索的默认文件名。 
● 每个构建文件只能有一个<project> 元素。

在cmd窗口中进入到当前build.xml目录

ant 
在当前目录下的build.xml运行Ant,执行缺省的target。

ant -buildfile build-test.xml 
在当前目录下的build-test.xml运行Ant,执行缺省的target。

ant -buildfile build-test.xml clean 
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target。

ant -buildfile build-test.xml -Dbuild=build/classes clean 
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target,并设定build属性的值为build/classes。

七、ant脚本:使用节点、元素和属性、命令指令

1、project 节点元素

project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。接下来向读者展示一下 project 元素的各属性。 
● name 属性:用于指定 project 元素的名称。 
● default 属性:用于指定 project 默认执行时所执行的 target 的名称。 
● basedir 属性:用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。

<?xml version="1.0" ?>
<project name="ant-project" default="print-dir" basedir=".">
    <target name="print-dir">
        <echo message="The base dir is: ${basedir}" />
    </target>
</project>

从上例可以看出,在这里定义了default 属性的值为print-dir,即当运行ant 命令时,如果没有指明执行的target,则将执行默认的target(print-dir)。此外,还定义了basedir 属性的值为 “.” ,.表示当前目录,进入当前目录后运行ant 命令,得一下结果:

 image

2、target节点元素

target为ant的基本执行单元或是任务,它可以包含一个或多个具体的单元/任务。多个target 可以存在相互依赖关系。它有如下属性: 
● name 属性:指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。 
● depends 属性:用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target ,被依赖的target 会先执行。 
● if 属性:用于验证指定的属性是存在,若不存在,所在 target 将不会被执行。 
● unless 属性:该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。 
● description 属性:该属性是关于 target 功能的简短描述和说明。 
示例:

<?xml version="1.0" ?>
<project name="ant-target" default="print">
    <target name="version" if="ant.java.version">
        <echo message="Java Version: ${ant.java.version}" />
    </target>
    <target name="print" depends="version" unless="docs">
        <description>
            a depend example!
        </description>
        <echo message="The base dir is: ${basedir}" />
    </target>
</project>

从以下结果后可以看到,我们运行的是名为 print的target ,由于它依赖于version这个target任务,所以 version将首先被执行,同时因为系统配置了JDK,所以 ant.java.version 属性存在,执行了version,输出信息:"[echo] Java Version: 1.6 ",version执行完毕后,接着执行 print,因为docs不存在,而unless属性是在不存在时进入所在target 的,由此可知 print得以执行,输出信息:"[echo] The base dir is:D:\Workspace\AntExample\build"。

image 

3、property属性节点元素

property元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引: 
<property file="build.properties"/> 
property 元素可用作 task 的属性值。在 task 中是通过将属性名放在${属性名}之间,并放在 task 属性值的位置来实现的。 
Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getProperties() 方法得到的属性一致,这些系统属性可参考 sun 网站的说明。同时, Ant 还提供了一些它自己的内置属性,如下: 
basedir: project 基目录的绝对路径;   
ant.file: buildfile的绝对路径,上例中ant.file值为D:\Workspace\AntExample\build; 
ant.version: Ant 的版本信息,本文为1.8.1 ; 
ant.project.name: 当前指定的project的名字,即前文说到的project的name属性值; 
ant.java.version: Ant 检测到的JDK版本,本文为 1.6 。

举例说明如下:

<project name="ant-project" default="example">
    <property name="name" value="jojo" />
    <property name="age" value="25" />
    <target name="example">
        <echo message="name: ${name}, age: ${age}" />
    </target>
</project>

上例中用户设置了名为name 和age的两个属性,这两个属性设置后,在下文中可以通过 ${name} 和 ${age} 分别取得这两个属性值。

4、copy命令

copy主要用来对文件和目录的复制功能。举例如下: 
● 复制单个文件: 
<copy file="old.txt" tofile="new.txt"/>

● 对文件目录进行复制: 
<copy todir="../dest_dir"> 
    <fileset dir="src_dir"/> 
</copy>

● 将文件复制到另外的目录: 
<copy file="src.txt" todir="c:/base"/>

5、delete命令

对文件或目录进行删除,举例如下:

● 删除某个文件:    
<delete file="/res/image/cat.jpg"/>

● 删除某个目录:    
<delete dir="/res/image"/>

● 删除所有的jar文件或空目录: 
<delete includeEmptyDirs="true"> 
       <fileset dir="." includes="**/*.jar"/> 
</delete>

6、 mkdir 命令

创建目录。 
<mkdir dir="/home/philander/build/classes"/>

7、 move 命令

移动文件或目录,举例如下: 
● 移动单个文件: 
<move file="sourcefile" tofile=”destfile”/>

● 移动单个文件到另一个目录: 
<move file="sourcefile" todir=”movedir”/>

● 移动某个目录到另一个目录: 
<move todir="newdir"> 
    <fileset dir="olddir"/> 
</move>

8、echo 命令

该任务的作用是根据日志或监控器的级别输出信息。它包括 message 、 file 、 append 和 level 四个属性,举例如下 
<echo message="ant message" file="/logs/ant.log" append="true">

9、jar 标签节点元素

该标签用来生成一个JAR文件,其属性如下。 
● destfile表示JAR文件名。 
● basedir表示被归档的文件名。 
● includes表示别归档的文件模式。 
● exchudes表示被排除的文件模式。

● compress表示是否压缩。

示例:

<jar destfile="${webRoot}/${ash_jar}" level="9" compress="true" encoding="utf-8" basedir="${dest}">
    <manifest>
        <attribute name="Implementation-Version" value="Version: 2.2"/>
    </manifest>
</jar>

上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件内容

同样打包操作的的还有war、tgz,已经解压操作uzip

<!-- 创建zip -->
<zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> 
<!-- 创建tgz -->
<gzip src="classes\**\*.class" zipfile="output.class.gz"/>
<!-- 解压zip -->
<unzip src="output.class.gz" dest="extractDir"/>
<!-- 建立war包 -->
<war destfile="${webRoot}/ash.war" basedir="${basedir}/web" webxml="${basedir}/web/WEB-INF/web.xml">
    <exclude name="WEB-INF/classes/**"/>
    <exclude name="WEB-INF/lib/**"/>
    <exclude name="WEB-INF/work/_jsp/**"/>
    <lib dir="${lib.dir}" includes="**/*.jar, **/*.so, **/*.dll">
        <exclude name="${webRoot}\${helloworld_jar}"/>
    </lib>
    <lib file="${webRoot}/${helloworld_jar}"/>
    <classes dir="${dest}" includes="**/*.xml, **/*.properites, **/*.xsd"> </classes>
</war>

10、javac 标签节点元素

该标签用于编译一个或一组java文件,其属性如下。 
● srcdir表示源程序的目录。 
● destdir表示class文件的输出目录。 
● include表示被编译的文件的模式。 
● excludes表示被排除的文件的模式。 
● classpath表示所使用的类路径。 
● debug表示包含的调试信息。 
● optimize表示是否使用优化。 
● verbose 表示提供详细的输出信息。 
● fileonerror表示当碰到错误就自动停止。

示例

<javac srcdir="${src}" destdir="${dest}"/>
<!-- 设置jvm内存
<javac srcdir="src" fork="true"/> 
<javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" 
memoryMaximumSize="128m"/> 
-->

11、java 标签节点元素

该标签用来执行编译生成的.class文件,其属性如下。 
● classname 表示将执行的类名。 
● jar表示包含该类的JAR文件名。 
● classpath所表示用到的类路径。 
● fork表示在一个新的虚拟机中运行该类。 
● failonerror表示当出现错误时自动停止。 
● output 表示输出文件。 
● append表示追加或者覆盖默认文件。

示例

<java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/>

12、arg 数据参数元素

由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。 
● values 是一个命令参数。如果参数中有空格,但又想将它作为单独一个值,则使用此属性。 
● file 表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。 
● line 表示用空格分隔的多个参数列表。 
● 表示路径,一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。 
● pathref 引用的path(使用path元素节点定义path)的id 
● prefix 前缀 
● suffix 后缀

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

13、ervironment 类型

由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。 
● file表示环境变量值的文件名。此文件名要被转换位一个绝对路径。 
● path表示环境变量的路径。Ant会将它转换为一个本地约定。 
● value 表示环境变量的一个直接变量。 
● key 表示环境变量名。 
注意 file path 或 value只能取一个。

14、filelist 文件集合列表

filelist 是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。 
● dir是用于计算绝对文件名的目录。 
● files 是用逗号分隔的文件名列表。 
● refid 是对某处定义的一个<filelist>的引用。 
注意 dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。

示例

<filelist id="docfiles" dir="${doc.src}" files="foo.xml,bar.xml"/> 
文件集合 ${doc.src}/foo.xml和${doc.src}/bar.xml. 这些文件也许还是不存在的文件.
<filelist id="docfiles" dir="${doc.src}" files="foo.xml bar.xml"/> 
 
<filelist refid="docfiles"/> 
 
<filelist id="docfiles" dir="${doc.src}">
    <file name="foo.xml"/>
    <file name="bar.xml"/>
</filelist>

15、fileset 文件类型

fileset 数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。 
● dir表示fileset 的基目录。 
● casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true. 
● defaultexcludes 用来确定是否使用默认的排除模式,默认为true。 
● excludes 是用逗号分隔的需要派出的文件模式列表。 
● excludesfile 表示每行包含一个排除模式的文件的文件名。 
● includes 是用逗号分隔的,需要包含的文件模式列表。 
● includesfile 表示每行包括一个包含模式的文件名。

示例

<fileset id="lib.runtime" dir="${lib.path}/runtime">
    <include name="**/*.jar"/>
    <include name="**/*.so"/>
    <include name="**/*.dll"/>
</fileset>
 
<fileset id="lib.container" dir="${lib.path}/container">
    <include name="**/*.jar"/>
</fileset>
 
<fileset id="lib.extras" dir="${lib.path}">
    <include name="test/**/*.jar"/>
</fileset>

16、patternset 类型

fileset 是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。

<patternset>支持4个属性:includes、excludex、includexfile、excludesfile,这些与fileset相同。

patternset 还允许以下嵌套元素:include,exclude,includefile 和 excludesfile.

示例

<!-- 黑白名单 -->
<patternset id="non.test.sources">
  <include name="**/*.java"/>
  <!-- 文件名包含Test的排除 -->
  <exclude name="**/*Test*"/>
</patternset>
 
 
<patternset id="sources">
  <include name="std/**/*.java"/>
  <!-- 判断条件 存在professional就引入 -->
  <include name="prof/**/*.java" if="professional"/>
  <exclude name="**/*Test*"/>
</patternset>
 
<!-- 一组文件 -->
<patternset includesfile="some-file"/>
<patternset>
  <includesfile name="some-file"/> 
<patternset/>
 
<patternset>
  <includesfile name="some-file"/> 
  <includesfile name="${some-other-file}" if="some-other-file"/> 
<patternset/>

17、filterset 类型

filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。 
主要属性如下: 
● begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。 
● endtoken 表示嵌套过滤器所搜索的记号这是标识其结束的字符串。 
● id 是过滤器的唯一标志符。 
● refid 是对构建文件中某处定义一个过滤器的引用。

示例

<!-- 将目标文件build.dir目录中的version.txt文件内容中的@DATE@替换成TODAY当前日期的值,并把替换后的文件存放在dist.dir目录中 -->
<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <filterset>
    <filter token="DATE" value="${TODAY}"/>
  </filterset>
</copy>
 
<!-- 自定义变量的格式 -->
<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <!-- 从version.txt中的%位置开始搜索,到*位置结束,进行替换内容中的@DATE@替换成TODAY当前日期的值-->
  <filterset begintoken="%" endtoken="*">
    <filter token="DATE" value="${TODAY}"/>
  </filterset>
</copy>
 
<!-- 使用外部的过滤定义文件 -->
<copy toDir="${dist.dir}/docs">
  <fileset dir="${build.dir}/docs">
    <include name="**/*.html">
  </fileset>
  <filterset begintoken="%" endtoken="*">
    <!-- 过来文件从外部引入,过来的属性和值配置在dist.properties文件中 --> 
    <filtersfile file="${user.dir}/dist.properties"/>
  </filterset>
</copy>
 
<!-- 使用引用方式,重复利用过滤集 -->
<filterset id="myFilterSet" begintoken="%" endtoken="*">
  <filter token="DATE" value="${TODAY}"/>
</filterset>
 
<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <filterset refid="myFilterSet"/>
</copy>

18、path类型

path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作几个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。 
● location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。 
● refid 是对当前构建文件中某处定义的一个path的引用。 
● path表示一个文件或路径名列表。

示例

<path id="buildpath">
    <fileset refid="lib.runtime"/>
    <fileset refid="lib.container"/>
    <fileset refid="lib.extras"/>
</path>
 
<path id="src.paths">
    <fileset id="srcs" dir=".">
        <include name="src/**/*.java"/>
    </fileset>
</path>

 

八、ant编译打包、运行工程

<?xml version="1.0" encoding="UTF-8"?>
<!-- name是当前工程的名称,default是默认执行的任务,basedir是工作目录(.代表当前根目录) -->
<project name="HelloWorld" default="run" basedir=".">
    <!-- property类似于程序中定义简单的变量 -->
    <property name="src" value="src"/>
    <property name="dest" value="classes"/>
    <property name="hello_jar" value="helloWorld.jar"/>
    <!-- 
    target是一个事件、事情、任务, name是当前事情的名称,depends是依赖的上一件或是多件事情
    如果所依赖的事情没有执行,ant会先运行依赖事情,然后再运行当前事情
    -->
    
    <!-- 初始化 -->
    <target name="init">
        <!-- 建立classes目录 -->
        <mkdir dir="${dest}"/>
        <mkdir dir="temp"/>
        <mkdir dir="temp2"/>
    </target>
    
    <!-- 编译 -->
    <target name="compile" depends="init">
        <javac srcdir="${src}" destdir="${dest}"/>
        <!-- 设置jvm内存
        <javac srcdir="src" fork="true"/> 
        <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" 
        memoryMaximumSize="128m"/> 
        -->
    </target>
    
    <!-- 建立jar包 -->
    <target name="build" depends="compile">
        <!-- 
        <jar jarfile="${hello_jar}" basedir="${dest}"/>
        创建一个名称是package.jar文件
        <jar destfile="package.jar" basedir="classes"/> 
        -->
        <jar destfile="${hello_jar}" basedir="classes"> 
            <!-- 向jar包中的main文件中添加内容 -->
            <manifest> 
                <attribute name="Built-By" value="${user.name}"/> 
                <attribute name="Main-class" value="package.Main"/> 
            </manifest> 
        </jar> 
        <!-- 复制jar文件  todir="复制到目录"-->
        <copy file="${hello_jar}" tofile="${dest}\temp.jar"/> 
        <copy todir="temp"> 
            <!-- 不按照默认方式 defaultexcludes="" -->
              <fileset dir="src"> 
                <include name="**/*.java"/>
              </fileset> 
        </copy> 
        
        <copy todir="temp2"> 
            <fileset dir="src">
                <and>
                    <contains text="main"/> 
                    <size value="1" when="more"/> 
                </and>
            </fileset>
        </copy> 
        
        <!-- 移动jar文件 -->
        <move file="${dest}\temp.jar" tofile="temp\move-temp.jar"/> 
        <!-- 创建zip -->
        <zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> 
        <!-- 创建tgz -->
        <gzip src="classes\**\*.class" zipfile="output.class.gz"/>
        <!-- 解压zip -->
        <unzip src="output.class.gz" dest="extractDir"/> 
        <!--替换input.txt内容中的old为new
        <replace file="input.txt" token="old" value="new"/>
        --> 
    </target>
    
    <!-- 运行 -->
    <target name="run" depends="build">
        <java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/>
    </target>
    
    <!-- 清除 -->
    <target name="clean">
        <!-- 删除生成的文件 -->
        <delete dir="${dest}"/>
        <delete file="${hello_jar}"/>
    </target>
    
    <tstamp> 
       <format property="OFFSET_TIME" 
               pattern="HH:mm:ss" 
               offset="10" unit="minute"/> 
    </tstamp>
    
    <!-- 重新运行 -->
    <target name="rerun" depends="clean,run">
        <echo message="###${TSTAMP}#${TODAY}#${DSTAMP}###"/>
        <aunt target="clean"/>
        <aunt target="run"/>
    </target>
</project>

要说的的东西基本上就那么多,ant还有很多内容没有提到,有兴趣的可以自己去研究研究。ant不难,你用它就像是在docs控制台输入命令行一样,只不过ant是将命令行转换为xml的脚本信息,可以进行重复的运行。在一定情况下,提高了效率和重复的工作。

二、案例分析之压缩js

1.build.properties

charSet = UTF-8
compressType=js
name=jquery.xtable
core=jquery.xtable
resources=../wage-test/js
deploy_dir=../wage-test/js/component

2.build.xml

<?xml version="1.0" encoding="UTF-8"?>


<project name='jscompress' basedir='.' default='compress'>
<!-- 引入属性文件-->
<property file="build.properties"/>
<property name="resources" value="${resources}"/>
<property name="dist" value="./release/${compress}"/>

<!-- 引入jar-->
<taskdef resourse="net/sf/antcontrib/antcontrib.properties" classpath="./lib/ant-contrib-1.0b3.jar"/>  
<taskdef name="compress" classname="com.yahoo.platform.yui.compressor.YUICompressTask" classpath="./lib/yuicompressor-2.4.2.jar;./lib/YUIAnt-zh_CN.jar" />
<!-- 开始压缩js-->
<target name="compress" description="压缩合并js">
<echo message="开始压缩文件${resource},文件类型${compressType}"/><!-- 输出message级别的信息-->
<delete dir="${dist}"/><!-- 删除文件夹-->
<if>
<not><!-- 不存在-->
<isset property="deploy_dir"/><!-- 判读此属性是否存在-->
   </not>
<then><!-- 不存在执行以下命令-->
<var name="deploy_dir" value="../tool/"/><!-- 声明变量-->
</then>
</if>
<var name="allName" value="${deploy_dir}/${name}.all.${compressType}/"/>
   <var name="allMinName" value="${deploy_dir}/${name}.all.min.${compressType}"/>
<if>
<isset property="core"/>
<then>
<echo message="***********exec ux ***************"/>
<mkdir dir="${dist}/ux"/>
<copy todir="${dist}">
<fileset dir="${resources}"><!-- 复制${resources}文件夹下的${core}的文件-->
<include name="${core}"/>
   </fileset>
</copy>
<copy todir="${dist}/ux">
<fileset dir="${resources}"><!-- 复制${resources}文件夹下的不包含文件${core}.${compressType}、**/*.all.${compressType}、**/*.all.min.${compressType}的所有文件-->
<exclude name="${core}.${compressType}"/>
<exclude name="**/*.all.${compressType}"/>
<exclude name="**/*.all.min.${compressType}"/>
</fileset>
</copy>
</then>
<else>
<echo message="**************** exec normal **************"/>
<mkdir dir="${dist}"/>
<copy todir="${dist}">
<fileset dir="${resources}">
<exclude name="**/*.all.${compressType}" />
<exclude name="**/*.all.min.${compressType}" />
</fileset>
</copy>
</else>
</if>
<!--合并 js  -->
<concat destfile="${allName}" encoding="${charset}" outputencoding="${charset}"><!-- 合并文件 将./release/${compressType}的"**/*.${compressType}的所有文件合并到${allName}中-->
<fileset dir="./release/${compressType}">
<include name="**/*.${compressType}"/>
</fileset>
</concat>
<!--target compress 调用 Yui Compressor 对合并后的 js 进行压缩 -->
<!-- linebreak : 在指定的列后插入一个 line-bread 符号  -->
<!-- warn : -->
<!-- charset : 指定读取输入文件使用的编码-->
<!-- munge : 只压缩, 不对局部变量进行混淆-->
<!-- preserveallsemicolons : 保留所有的分号。 -->
<!-- outputfolder : 指定合并后输出到的文件夹-->
<compress linebreak="900000" warn="false" charset="${charset}" encoding="${charset}" munge="yes" preserveallsemicolons="true" outputfolder="${dist}">
<fileset dir="${dist}">
<include name="**/*.${compressType}"/>
</fileset> 
</compress>
<concat destfile="${allMinName}" encode="${charset}" outputencoding="${charset}">
<fileset dir="./release/${compressType}">
<include name="**/*.${compressType}"/>
</fileset>
</concat>
<delete dir="${dist}"/>
<echo message="压缩完成,文件:${allName},${allMinName},刷新${deploy_dir}目录进行查看"/>
</target>

</project>




<?xml version="1.0" encoding="UTF-8"?>


<project name="jade-hr-info" basedir="." default="help">
<!-- 引用资源文件-->
<property file="../../jade-libs/build.properties"/>
<!-- 代码目录- -->
<!-- ${ant.project.name} an内置属性 获取当前项目名称- -->
<property name="project.java" value="../${ant.project.name}/src/java" />
<property name="project.web" value="../${ant.project.name}/src/web" />
<property name="project.conf" value="../${ant.project.name}/conf" />

<!-- lib.home.ref=../jade-libs-->
<!-- java编译classpath-->
<path id="master-classpath">
<!-- 加入公用的lib包-->
<fileset dir="${lib.home.ref}">
<include name="**libs/*.jar"/>
</fileset>
</path>
<target name="help">
<echo message="JadeFortune Application Build File for JDK1.5" />
<echo message="用法:ant -[target]" />
<echo message="------------------------------------------------------" />
<echo message="[target]如下" />
<echo message="  clean        清空所有输出文件包括build和部署目录" />
<echo message="  exploded-app 创建展开目录形式的应用结构" />
<echo message="  war          创建用于发布的WAR包文件(适用于生产打包、远程部署)" />
<echo message="  deploy       将扩展目录直接copy到appserver运行环境下(适用于编译环境与运行环境分离)" />
<echo message="  i18n         将资源文件转换成UTF-8码,并copy到 classpath下(适用于热部署)" />
<echo message="------------------------------------------------------" />
</target>
<!-- 创建时间撮-->
<tstamp/>
<!-- 清洗包-->
<!-- target : jdk版本-->
<!-- debug :  编译后的文件允许调试,没有加上的话有些eclipse版本可能会出现警告-->
<!-- deprecation :假如为真,将会给出不建议使用的API,默认值false -->
<!-- optimize :。 -->
<!-- failonerror :指定 clientgen Ant 任务在出现错误的情况下是否继续执行。 此特性的有效值为 True 或 False。默认值为 True,这意味着即使遇到错误也要继续执行。  -->
<!-- fork : 为true时在外部启用一个新的JDK 编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时-->
<!-- memoryMaximumSize :如果 javac 在外部运行,则是底层 VM 的初始内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)  -->
<!-- includeantruntime : 作用是指定编译任务是否包含ant的classpath,可有可无,不影响编译,。 -->
<target name="jar">
<mkdir dir="../${ant.project.name}/bin"/>
<echo message="start refresh ${ant.project.name} sourse"/>
<!-- 编译代码,对应java中javac命令 srcdir定义源文件路径,destdir定义编译后文件路径-->
<javac destdir="../${ant.project.name}/bin" target="1.5" debug="true" deprecation="false" optimize="false" failοnerrοr="true" fork="true" memoryMaximumSize="512m" includeantruntime="true">
<src path="${project.java}"/>
   <!-- 定义编译所需要的classpath-->
<classpath refid="master-classpath"/>
</javac>
<echo message="end refresh ${ant.project.name} source"/>
<echo message="start refresh ${ant.project.name} source"/>
<!-- jar操作,jarfile指定jar包存放的路径,basedir为编译后的class的目录-->
<!--${lib.build}=./jade-base-libs  jade-libs/jade-base-libs/jade-hr-info.jar-->
<!-- compress : -->
<jar basedir="../${ant.project.name/bin}" jarfile="${lib.home.ref}/${lib.build}/${ant.project.name}.jar" compress="false">
<!-- 清单文件MAINFEST.MF(jar里面的)-->
<mainfest>
<attribute name="Version" value="1.0"/>
<attribute name="Date" value="${DSTAMP}"/>
<attribute name="Class-Path" value="${libs}"/>
<attribute name="Discription" value="描述"/>
</mainfest>
</jar>
<echo message="success for build ${ant.project.name} jar"/>
<delete dir="temp/building"/>
</target>

<target name="copyJSPAndXml" description="将指定的java source 汇集在一起">
<echo message="start copy ${ant.project.name} jspAndXml"/>
<!-- 发布文件,把页面,配置,等拷贝到对应的发布目录下-->
<!-- web.xml spring-core.xml struts-core.xml 不需要复制-->
<!-- 拷贝页面-->
<copy todir="${dirploy_dir}/${war.name.gdpos}" >
<fileset dir="${project.web}">
<exclude name="WEB-INF/web.xml"/>
<exclude name="WEB-INF/**/*/spring-core.xml"/>
<exclude name="WEB-INF/**/*/struts-core.xml"/>
</fileset>
</copy>
<!-- 拷贝配置-->
<copy todir="${deploy_dir}/${war.name.gdpos}/WEB-INF/classes">
<fileset dir="${project.conf}"/><!-- 文件夹下所有文件 不用过滤-->
</copy>
<echo message="end copy ${ant.project.name} JSPAndXml"/>
</target>
<!-- 创建编译任务,名字是compile,depends指定了complie任务依赖的init任务-->
<target name="init" description="complie target">
<echo message="start excute ${ant.project.name} sub build.xml"/>
<!-- 执行子项目的build.xml文件-->
<ant antfile="build.xml" dir="${project.root}/${project.name}"/>
<echo message="end execute ${ant.project.name} sub build.xml">

</target>
<target name="exploded-app" depends="init,copyJSPAndXml" description="步骤聚合"/>
<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="../jade-libs/tools/lib/ant-contrib-1.0b3.jar" />
<target name="copyI18nXml">
<if>
<available file="${project.conf}/i18n"<!-- 如果存在${project.conf}/i18n文件夹就复制到指定文件夹下-->
<then>
<copy todir="${i18nDir}">
<fileset dir="${project.conf}/i18n" />
</copy>
</then>
</if>
</target>


</project>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值