• Ant 阅读笔记


    Ant 笔记
    (0)概述:
    Ant, 感觉上类似于原来的make文档。
    主要的作用是方便项目的自动部署,现在有一个更新的Meaven可以作为Ant的替代品,不过Ant的应用目前仍然十分广泛。

    Ant可以理解为以xml为基础编写的脚本,自动执行以完成一系列的任务。这点和bat也有相似的地方,总之是一个很简单但及其有用的东西。
    Ant通常不用作为项目release的组建发布,实际上它一般是在项目开发,部署期间提供的一个发布工具。用ant会简化很多本该手动完成的 文件操作/编译任务。

    随便找了一个Ant的Ebook, 资料不多30多页,大致看看,验证我对Ant的猜测是否正确。然后也顺便系统的了解一下Ant的思想和实现。

    Ant 需要安装,并且需要设置path环境变量,这样ant 本身发布的命令才能够在命令行环境中执行,这点和JDK的java,javac.等命令是一个意思。

    Ant 有个很重要的扩展点是,我们可以很方便地编写自定义的ant任务.

    --另外,手上的这本教程是一个UK IBM的工程师写的.
    --Ant 的缩写居然是 Another neat tool(另一个灵巧地工具)....

    Ant 有一个特性是跨平台,当然这个特性是从Java继承得到的.

     

    (1)Ant脚本(xml)的基本结构:

    -project
     |
     |-target1
     |-target2
     |-target3

    其中target是步骤地抽象.
    target中可以包含任意数量的操作.
    这些target中的操作按照一定顺序执行,整个project的任务就实现了.这个project也可以理解为一个ant项目.

     

    (2)Ant的属性:
    类似于程序语言中的变量.
    名称与键值对的抽象.
    具体类似于如下,在脚本的其他位置可以对定义的属性进行引用.
    <property name="metal" value="beryllium"/>
    引用语法为:
    ${metal}

    Ant中有许多预定义的属性.如Java环境设置.
    如:${user.home}
    属性经常用于引用文件系统上的文件或者目录.
    如果属性是为了定义系统路径,那么使用location 比使用value好.

    <property name="srcpath" location="archive/databases/"/>
    优于:
    <property name="srcpath" value="archive/databases/"/>

    因为不同的操作系统,有的用"\"作为路径分隔符,有的用"/"做路径分隔符.
    使用location, ant将自动将路径转换成操作系统合法的路径名.从而增加了ant脚本的移植性。
    或者干脆同时维护一个win_build.xml和unix_build.xml.

    (3)依赖(depends)
    <target>可能依赖其它的target.
    这句话的意思是指,要完成一个target, 需要优先完成其他的target.
    例如:
    <target name="init"/>
    <target name="preprocess" depends="init"/>
    <target name="compile" depends="init,preprocess"/>
    <target name="package" depends="compile"/>

    如果我们让ant执行任务 package. 那么它会自动先执行init, preprocess, compile, 最后才是package.
    这个依赖关系很好理解,但对于ant来说,及其重要,我认为依赖是ant思想的核心。
    这样,我也可以只执行compile. 那么操作序列将只进行到compile, 不会执行package.

    另外一点需要着重说明: ant中target的执行顺序与target在脚本中出现的位置没有关系。
    target的执行由依赖唯一确定。

     

    (4) 运行ant
    ant 在eclipse的运行(或其他IDE)不理会了。只关心命令行。IDE也只是用UI来替代了命令行的调用。
    ant -file build_prop.xml
    运行ant可以编写一个bat来完成。


    (5)生成项目
    <编译任务>:
    由于 Ant 的主要目标是生成 Java 应用程序,它能够内在地、出色地支持调用 javac 编译器以及
    其他 Java 相关任务就毫不奇怪了。下面是编译 Java 代码的任务的编写方式:
    <javac srcdir="src"/>
    这个标签寻找 src 目录中以 .java 为扩展名的所有文件,并对它们调用 javac 编译器,从而在相
    同的目录中生成类文件。当然,将类文件放在一个单独的目录结构中通常会更清晰;可以通过添加
    destdir 属性来让 Ant 做到这点。其他有用的属性包括:
    · classpath:等价于 javac 的 -classpath 选项。
    · debug="true":指示编译器应该带调试信息编译源文件。


    <JAR任务>
    在编译 Java 源文件之后,结果类文件通常被打包到一个 JAR 文件中,这个文件类似 zip 归档文
    件。每个 JAR 文件都包含一个清单文件,它可以指定该 JAR 文件的属性。
    下面是 Ant 中 jar 任务的一个简单使用例子:
    <jar destfile="package.jar" basedir="classes"/>
    这将创建一个名为 package.jar 的 JAR 文件,并把 classes 目录中的所有文件添加到其中(JAR
    文件能够包含任意类型的文件,而不只是类文件)。此处没有指定清单文件,因此 Ant 将提供一个
    基本的清单文件。
    manifest 属性允许指定一个用作该 JAR 文件的清单的文件。清单文件的内容还可以使用 manifest
    任务在生成文件中指定。这个任务能够像文件系统写入一个清单文件,或者能够实际嵌套在 jar 之
    内,以便一次性地创建清单文件和 JAR 文件。 例如:
    <jar destfile="package.jar" basedir="classes">
    <manifest>
    <attribute name="Built-By" value="${user.name}"/>
    <attribute name="Main-class" value="package.Main"/>
    </manifest>
    </jar>


    (6)文件系统操作
    <创建/删除目录>
    最基本的文件系统操作之一就是创建目录或文件夹。做这项工作的任务名为 mkdir,毫不奇怪,它
    非常类似于具有相同名称的 Windows 和 UNIX/Linux 命令。
    <mkdir dir="archive/metals/zinc"/>

    首先要注意 / 被用作目录分隔符,这是 UNIX 和 Linux 的惯例。您可能认为这不是很平台无关的,
    但是 Ant 知道如何处理它,并针对它运行所在的平台做恰当的事情,这与我们在前面定义基于位置
    的属性时所看到的方式相同。我们能够同样容易地使用 \,而不管平台是什么 —— Ant 能够处理
    任一种形式,甚至能够处理两种形式的混合。
    mkdir 任务的另一个有用特性是它的如下能力:在父目录还不存在时创建它们。考虑一下上面的清
    单,设想 archive 目录存在,但是 metals 目录不存在。如果使用底层平台的 mkdir 命令,您需
    要首先显式地创建 metals 目录,然后第二次调用 mkdir 命令来创建 zinc 目录。但是 Ant 任务
    Ant 使用指南
    Java爱好者 第 20页 http://www.javafan.net
    比这更加智能,它能够一次性创建这两个目录。类似地,如果目标目录已经存在,mkdir 任务不会
    发出错误消息,而只是假设它的工作已经完成,从而什么也不做。
    删除目录同样也很容易:
    <delete dir="archive/metals/zinc"/>
    这将删除指定的目录连同它包含的所有文件以及子目录。使用 file 属性而不是 dir 属性可以指定
    要删除的单个文件。

    <复制/移动文件/目录>
    在 Ant 中制作文件的一份拷贝很简单。例如:
    <copy file="src/Test.java" tofile="src/TestCopy.java"/>
    您还可以使用 move 来执行重命名操作而不是拷贝文件:
    <move file="src/Test.java" tofile="src/TestCopy.java"/>
    另一个常用的文件系统操作是将文件复制或移动到另一个目录。做这项工作的 Ant 语法同样也很简
    单:
    <copy file="src/Test.java" todir="archive"/>
    <move file="src/Test.java" todir="archive"/>

    <压缩/解压缩>
    <zip destfile="output.zip" basedir="output"/>
    Ant 使用指南
    Java爱好者 第 21页 http://www.javafan.net
    相同的语法也可用于创建 tar 文件。 还可以使用 GZip 和 BZip 任务来压缩文件。例如:
    <gzip src="output.tar" zipfile="output.tar.gz"/>
    解压缩和提取文件同样也很简单:
    <unzip src="output.tar.gz" dest="extractDir"/>
    还可以包括 overwrite 属性来控制覆盖行为。默认设置是覆盖与正在被提取的归档文件中的条目相
    匹配的所有现有文件。相关的任务名称是 untar、unjar、gunzip 和 bunzip2。


    <替换文件中的标记>
    我们将在本节考察的最后一个文件系统操作是 replace 任务,它执行文件中的查找和替换操作。
    token 属性指定要查找的字符串,value 属性指定一个新的字符串,查找到的标记字符串的所有实
    例都被替换为这个新的字符串。例如:
    <replace file="input.txt" token="old" value="new"/>


    (7)重要的模式匹配 与文件选择器
    在前面考察文件系统任务时,我们仅使用了单独地命名的文件和目录。然而,一次对一组文件执行
    那些操作经常是有用的 —— 例如对给定目录中以 .java 结尾的所有文件执行操作。正如等价的
    DOS 和 UNIX 命令提供了这样的功能一样,Ant 也提供了这样的功能。这是使用通配符字符来完成
    的:*,它匹配零个或多个字符;以及 ?,它仅匹配一个字符。因而匹配以 .java 结尾的所有文件
    的模式不过就是 *.java。
    也可以对目录执行模式匹配。例如,模式 src*/*.java 将匹配带 src 前缀的任何目录中的所有
    Java 文件。 还有另一种模式结构:**,它匹配任意数量的目录。例如,模式 **/*.java 将匹配当
    前目录结构下的所有 Java 文件。
    您能够以相当一致的方式对文件系统任务使用模式,比如嵌套的 fileset 元素。先前,我们使用这
    个任务来复制单个文件:
    <copy file="src/Test.java" todir="archive"/>
    如果我们想要使用一个模式,可以将 file 属性替换为一个 fileset 元素,如下所示:
    <copy todir="archive">
    <fileset dir="src">
    <include name="*.java"/>
    </fileset>
    </copy>
    fileset 默认情况下包含指定 src 目录下的所有文件,因此为了仅选择 Java 文件,我们对模式使
    用一个 include 元素。类似地,我们可以对另一个模式添加一个 exclude 元素,从而潜在地排除
    include 指定的匹配项。甚至可以指定多个include 和 exclude 元素;这样将得到一组文件和目录,
    它们包含 include 模式的所有匹配项的并集,但排除了 exclude 模式的所有匹配项。
    注意还有一个通常很有用的文件集特性,但是对于没有意识到它的人来说,这个特性偶尔会产生混
    淆。这个特性称为 默认排除:即自动从文件集内容中排除的内置模式列表。该列表包括与名为 CVS
    的目录相匹配的条目,以及以 ~ 字符结尾的文件,它们可能是备份文件。您通常不想在文件系统操
    作中包括这类文件和目录,因此排除这些文件是默认行为。然而,如果确实想无例外地选择 所有 文
    件和目录,可以将文件集的 defaultexcludes 属性设置为 no。


    正如我们已经看到的,文件集用于指定一组文件,并且这个组的内容可以使用 include 和 exclude
    模式来指定。也可以结合称为 选择器 的特殊元素使用include 和 exclude 来选择文件。下面是
    对 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 属性用于选择具有
    想要的目录层次数目的的文件。
    Ant 使用指南
    Java爱好者 第 24页 http://www.javafan.net
    还可以通过在一个选择器 容器 内嵌套一个或多个选择器来组合选择器。 最常用的选择器容器 and
    仅选择它包含的所有选择器都选择了的文件。其他选择其容器包括 or、not、none 和 majority。
    下面是一个文件集的例子,它仅选择那些大于 512 字节并且包含字符串“hello”的文件。
    <fileset dir="dir">
    <and>
    <contains text="hello"/>
    <size value="512" when="more"/>
    </and>
    </fileset>


    (
    后面还有文件链接和 自定义Ant任务没有察看。
    具体的运用可以具体分析,如此。利用于ant的能力,可以设想一个项目的release过程:
    (1)调用cvs任务,以某个只读权限从服务器下载项目。
    (2)调用javac任务对项目进行编译。
    (3)调用文件系统任务(包含模式匹配和文件选择器)对已生成的.class文件和资源文件进行部署。
    (4)调用文件系统任务对配置文件进行部署。
    ....
    整个一条龙服务。。。
    )

  • 相关阅读:
    uip源码剖析【三】——【网络层】ICMP解读
    uip源码剖析【五】——【传输层】TCP解读
    WebGame方案汇总
    终于,我生命中第一次编译并运行了手机程序
    使用R7版NDK搭建Android开发环境[不使用Cgywin]
    拷问Unity:开发U3D游戏要思考的问题
    浏览器缓存导致FLASH资源更新问题的解决方案
    山寨版的《KingdomRush(皇城突袭)》
    在Unity3D的网络游戏中实现资源动态加载
    Unity3d之无缝地形场景切换–解决方法和代码
  • 原文地址:https://www.cnblogs.com/BearOcean/p/1190084.html
Copyright © 2020-2023  润新知