IT Notes‎ > ‎Java‎ > ‎

Ant 笔记

Ant 官方网址: http://ant.apache.org/

Ant 是 Java 用户使用较多的自动构建工具. Eclipse 也集成有 Ant 插件. 虽然很多构建工作, 用 IDE 或者 Ant 都可以完成, 但它们之间的关系并非谁取代谁. Ant 本身的文档很好, 对每一个 task 都有解释, 可以当手册查阅, 文档可以在 {Ant_home}/docs 中找到, 也可以直接访问在线版本, 如果直接访问官网, 还能看到别的文档, 如 wiki 等. 下面的笔记即来自帮助文档, 主要说明构建文件的内容.

Ant 的构建文件是 XML 格式的, 通常叫 build.xml, 书写这个配置文件是使用 Ant 的关键. 在这个 XML 文件中, <project> 是根元素, 它的子元素可能有{property*, path*, target+}, 至少包含一个 <target> 元素, <target> 包含若干 <task> 元素(>=0个), 每个 <task> 元素都可以有一个 id 属性, 别的地方可以通过 id 引用该 task, id 的值是唯一的.

<project>有3个非必须的属性: name, default(设置缺省的 target), 和 basedir.

target
<target>可以设置依赖关系, 示例:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
对于 D, 它依赖于 C, 而 C依赖于 B, B 依赖于 A, 那么, 执行 A 就要先执行 C, 而执行 C 就要先执行 B, 类似, 需要先执行 A. 因此,当执行 D 时, 实际的执行顺序是 A->B->C->D, 而且 D 中的依赖 B, A 已经通过执行 C 时执行过, 就不会在执行了. 所以
<target name="D" depends="C,B,A"/>

<target name="D" depends="C"/>
在有:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
的前提下, 是等价的.

<target>标签有如下属性: name, depends, if, unless, description. 只有 name 是强制属性.
注: 对于 name 属性值, 理论上只要是 XML 支持的字母数字字串就可以了, 比如空串"", 逗号",", 空格" "等, 但是不建议使用这几个符号, 而且Ant的后续版本也不会支持它们. 具体 IDE 的支持可能有些不同.

对于 if 和 unless 标签, 它检查是否有这个属性, 但是, A property set to the empty string is still an existing property.

task
A task is a piece of code that can be executed.
<task>通常的结构是:
<name attribute1="value1" attribute2="value2" ... />
task 有三类:
  1. 内建的(build-in)(TODO: link)
  2. 可选的(optional)(TODO: link)
  3. 自定义的
<task> 可以设置若干属性, 其中包括 name 和 id 属性, name 是 task 的名字, id 是必须唯一. id 可以在别处引用.

As of Ant 1.6 all tasks can be declared outside targets (earlier version only allowed <property>,<typedef> and <taskdef>). 不知道1.7如何? TODO: 实验.

A project can have a set of properties. Properties are case sensitive. 有一些内置的property.

path
(TODO: 以下需整理)path 是 project 的子元素,

示例:
    <path id="run.ArgoUML UML2-EUML debug.classpath">
        <path refid="argouml-app.classpath"/>
        <path refid="argouml-core-model.classpath"/>
        <pathelement location="${argouml-core-model-mdr.location}/lib/jmi.jar"/>
        ... ...
        <pathelement location="lib/antlr-2.7.7.jar"/>
        <pathelement location="lib/commons-logging-1.0.2.jar"/>
        ... ...
        <pathelement location="${argouml-core-model-euml.location}/lib/emf/org.eclipse.emf.common_2.4.0.v200902171115.jar"/>
        ... ...
    </path>
   
Task <java> 中使用:
    <target name="ArgoUML UML2-EUML debug">
        <java classname="org.argouml.application.Main" failonerror="true" fork="yes">
            <jvmarg line="-Xmx400M -ea -Dargouml.modules=org.argouml.sequence2.SequenceDiagramModule -Dlog4j.configuration=org/argouml/resource/full_console.lcf  -Dargouml.model.implementation=org.argouml.model.euml.EUMLModelImplementation"/>
            <classpath refid="run.ArgoUML UML2-EUML debug.classpath"/>
        </java>
    </target>

在Ant文件内的 escape 符号居然是 $, 如果要输出 $, 就要写成 $$.


内链接: Ant 命令
Subpages (1): Ant 命令
Comments