ant语法和规范

一、前言:

以前在做JavaEE项目的时候曾经听说过这个名字,但是由于没有用到,所以也没有去学习。最近在研究Android打包的时候,看了下build.xml文件,甚是迷糊,于是学习一下,稍有心得。

二、什么是ant?

ant是一种基于Java的打包工具,非常类似于Linux下的makefile。ant有自己的语法和规范,通常用xml来承载。ant可以集成代码生成、编译、打包等功能(需要说明一下,ant本身并不具备这些功能,只是调用者),使用ant能做到编译、打包一系列流程的自动化,就像生产流水线,一条指令,全程自动生产。

ant工具是使用Java语言编写的,所以依赖jdk,安装ant必须先安装好jdk。同样ant很多扩展的自定义的功能同样可以使用Java编写,后续会详细介绍。

三、ant的基本语法和规范

ant的构建脚本是使用xml文件承载的,缺省命名为build.xml。进入其文件所在目录,可以在cmd中直接使用ant命令调用(前提是先配好bin目录的环境变量)。

我们先来看一下build.xml文件的基本结构:

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="test" default="build">
  3. <property name="file.dir" value="D://"/>
  4. <property file="local.properties" />
  5. <loadproperties srcFile="project.properties" />
  6. <import file="rules.xml" optional="true" />
  7. <target name="build">
  8. <echo>runing...</echo>
  9. </target>
  10. <target name="debug" depends="build">
  11. <echo level="info">${file.dir} debugging...</echo>
  12. </target>
  13. </project>

project    根标签。name属性表示项目名称,没什么作用;default属性表示默认执行命令,cmd命令行中使用antant  default属性值(本例是ant build) 两种方式等效。

property  定义类标签。可以定义一些常量值,需要注意:定义后理论不能再修改(其实可以通过第三方库修改)。比如第3行定义了一个file.dir的变量,值为”D://“,引用时使用 ${file.dir}调用。第4行,是引入一个properties文件(里面定义了很多property),相当于导包。

loadproperties  引用标签。功能和第4行<property file=""/>等同,表示引入一个properties定义集群。好处是便于封装和管理。

import  引入标签。和loadproperties不同的是,import是引入另一个构建文件,包括变量和执行命令。

target  执行标签。可以在cmd命令行中直接ant + target执行,比如以上脚本可以执行: ant build 和 ant debug。target标签中有个depends属性,表示执行命令依赖。如果要执行debug命令,会自动先执行depends里面的命令。以上脚本执行 ant debug,实际是执行了 ant build 和 ant debug

echo  日志标签。表示日志输出,能在cmd命令中打印显示,level属性表示:日志级别。 比较特殊的是echo中可以引用变量,用法同变量调用方式${name}。

以上就是ant最基本的语法规范,我们执行下ant debug命令看看结果。

分析以上执行过程:cmd进入build.xml所在目录,执行target名为debug的命令,由于debug依赖于build,所以先执行build命令,打印出runing... 然后再执行debug命令下的语句,打印出D:// debugging... (注意其中引用了一个变量),执行完毕!

四、ant的常用语法

        1、文件语句

        文件操作是ant中最常用的基本操作,包括创建、复制、删除、遍历等。由于ant涉及最多的就是文件操作,所以它的api相对来说非常丰富,让我们来逐一介绍和学习。

创建:mkdir标签。 传入一个文件路径,直接创建出一个文件目录。然而不知为何ant没有提供创建文件的功能。

[html] view plain copy

  1. <mkdir dir="D:/test"/><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">      </span>

删除:delete标签。删除文件或文件夹。

[html] view plain copy

  1. <delete file="D:/test/example.txt"/>
  2. <delete dir="D:/test"/>

移动:move标签。包括文件重命名、文件移动、文件目录移动。

[html] view plain copy

  1. <!-- 重命名 -->
  2. <move file="D:/test/example1.txt" tofile="D:/test/example2.txt"/>
  3. <!-- 移动文件至新目录,新目录会自动创建 -->
  4. <move file="D:/test/example2.txt" todir="D:/test2"/>
  5. <!-- 文件夹移动 -->
  6. <move dir="D:/test/example2.txt" todir="D:/test2"/>

复制:copy标签。文件复制。

[html] view plain copy

  1. <!-- 文件复制,指定新文件名 -->
  2. <copy file="D:/test/example.txt" tofile="D:/test/example2.txt"/>
  3. <!-- 文件复制,指定新文件目录 -->
  4. <copy file="D:/test/example.txt" todir="D:/test/new/"/>
  5. <!-- 文件夹复制,指定新文件夹 -->
  6. <copy dir="D:/test/" todir="D:/test/new/"/>

        2、条件语句


condition标签,配合istrue或者isfalse使用。

[html] view plain copy

  1. <condition property="check">
  2. <istrue value="false" />
  3. </condition>
  4. <target name="build" if="check">
  5. <echo>build running...</echo>
  6. </target>

稍微解释下以上语句:在执行名为build的target任务时,由于target中含有if的标签,所以需要判断名为check的条件语句的值,但是istrue=false的语句表示条件不符合,echo并不会执行。如果改成istrue=true,echo将执行。当然以上语句等价于:

[html] view plain copy

  1. <condition property="check">
  2. <isfalse value="true" />
  3. </condition>
  4. <target name="build" if="check">
  5. <echo>build running...</echo>
  6. </target>

需要注意下,istrue和isfalse两种标签不能同时存在。

除了直接使用istrue指定条件语句的值,还能动态地使用equals比较变量,比如:

[html] view plain copy

  1. <property name="id" value="99"></property>
  2. <condition property="check">
  3. <equals arg1="${id}" arg2="100"/>
  4. </condition>
  5. <target name="build" if="check">
  6. <echo>build running...</echo>
  7. </target>

        3、循环语句
        ant本身并没有提供循环语句,但是我们可以借助于ant-contrib.jar使用循环语句,举个简单的例子:

[html] view plain copy

  1. <property name="ant-contrib" value="E:\\Android\\android-sdk\\tools\\lib\\ant-contrib-1.0b3.jar"></property>
  2. <taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" classpath="${ant-contrib}"/>
  3. <target name="build">
  4. <foreach list="1,2,3,4,5,6,7,8,9" param="number" delimiter="," target="log"/>
  5. </target>
  6. <target name="log">
  7. <echo>foreach running: ${number}</echo>
  8. </target>

以上语句稍微有些复杂,我们一句句来理。第一句property定义一个变量,即扩展jar包ant-contrib-1.0b3.jar所在的文件位置。第二句taskdef标签,表示定义自定义名为foreach的标签,需要引用类名和类路径,这是使用foreach的前提条件,必须先定义好。然后我们就可以在target任务中愉快地使用for循环了。
       接下来我们来看foreach语句的内容,list标签 + delimiter标签构成循环的条件,这里是循环9次,每次循环创建一个名为number的数字变量,同时执行log任务打印一句话,结果如下:

        4、自定义语句

ant的魅力所在之处就是强大的自定义语句,比如上面的foreach语句。ant官方库只定义了一些简单的语句,但是在实际项目中远远不足以满足我们的需要,比如新建一个文件。这里我们就用自定义语句来实现下。

ant的原理是每个语句标签映射一个java类文件,每个标签里的属性则映射java类的变量,有点类似spring中xml映射javabean。每个ant标签映射的java类文件不是随意编写的,有一定的规范。

在ant安装目录下的lib文件目录中有个名为ant.jar的包,这个就是ant的规范标准库,自定义语句Java类都需要依赖它来编译,同时每个语句必须继承其中名为Task.java的基类,复写execute方法执行自定义操作。

[java] view plain copy

  1. package com.ant.test;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.apache.tools.ant.BuildException;
  5. import org.apache.tools.ant.Task;
  6. public class FileCreater extends Task{
  7. private String fileName;
  8. public void setName(String fileName){
  9. this.fileName = fileName;
  10. }
  11. @Override
  12. public void execute() throws BuildException {
  13. try {
  14. new File(fileName).createNewFile();
  15. } catch (IOException e) {
  16. log("create file ‘" + fileName + "‘ failed!");
  17. }
  18. log("create file ‘" + fileName + "‘ successful!");
  19. super.execute();
  20. }
  21. }

上面定义了创建文件的自定位标签,把这个java文件打成jar包,然后就可以在build.xml使用了,xml内容如下:

[html] view plain copy

  1. <property name="fileJar" value="D:/file.jar"></property>
  2. <taskdef name="filecreater" classname="com.ant.test.FileCreater" classpath="${fileJar}"/>
  3. <target name="build">
  4. <filecreater name="D:/test.txt"/>
  5. </target>

以上执行的操作是创建一个路径为D:/test.txt的文件。filecreater是映射FileCreater.java的自定义标签,name属性传入文件路径名,会自动 反射调用FileCreater.java中的setName方法注入参数值。在FileCreater.java中有个log打印输出方法,可以在cmd中输出,极大方便我们的调试。执行结果如下:

------------------------------------------------------------------------------------------------>

好了,ant相关的就先写到这里,权当抛砖引玉^-^

http://blog.csdn.net/MegatronKings/article/details/48012125

时间: 2025-01-26 01:36:13

ant语法和规范的相关文章

ECMAScript6语法检查规范错误信息说明

项目中使用ECMAScript6的时候经查会使用语法检查,下面是常见错误信息的汇总: 1 “Missing semicolon.” : “缺少分号.”, 2 “Use the function form of \”use strict\”.” : “使用标准化定义function.”, 3 “Unexpected space after ‘-’.” : “在’-'后面不应出现空格.”, 4 “Expected a JSON value.” : “请传入一个json的值.”, 5 “Mixed s

XML的学习笔记(一)————基本语法和规范

题外:为什么我要学XML呢?因为发现ROS系统里面有好多程序,是XML的,当然,我看不到,所以就来补补课,因为暂时只要求能看懂,或能简单写几行,所以,记述的也就不是太详细了. 如何识别XML? 可以先介绍XML的一些简单的规则,XML本身就是一个文本文件,XML是通过标记来描述文件的,比如: <user> </user> "user"这两个就是标记,注意标记有开头就有结尾,结尾就是在开头的前面加一个"/". 可以描述其更描述的信息,比如想描述

我要学python之python语法及规范

注释 单行注释: #多行注释: """写入注释内容"""'''写入多行注释内容''' 备注:python中单引号和双引号作用是一致的. 变量 python的命名规则与java或者C#命名规则是类似的,如下 变量命名规则:1.变量名只能是字母.数字.下划线的任意组合2.不能数字开头3.关键字不能声明为变量 关键字 ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', '

Ant

java平台批处理命令执行程序,自动完成编译,测试,打包,部署 Eclipse集成了Ant 语法: 1. ant的编译文件默认为build.xml,一般无需改变. build.xml定义了Ant要执行批处理命令. 2.build.xml的根节点为<project>,一般格式如下: <project name="AntStudy" default="init" basedir="."> name为工程名称: default为

Jenkins系列——使用checkstyle进行代码规范检查【升级版】

1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ant脚本,而这个脚本中的多数代码是重复的. 报告采取覆盖方式,而我们有时需要保留一定构建次数的报告. 2.分析 使用变量代替ant脚本中变化的路径,这个变量通过ant命令的 -Dxxx=value 的方式传值. 建立名为${BUILD_NUMBER}的目录,将该次构建成功的报告保留在该目录下. 3.环境 同

低功耗之战!ANT VS Bluetooth LE

利用近距离无线通信技术将手机及可穿戴式传感器终端等与智能电话连接起来,实现新的功能.最近,以此为目标的行动正在展开.其中备受关注的近距离无线方式是“ANT”和“Bluetooth LE”.为了在各种便携终端上采用这些技术,手机.手表及保健电子产品的厂商开始加快行动. “终于要迎来能够用纽扣电池驱动的低耗电无线技术了.这样便可拿来配备到我们的手表上,实现与智能电话的连接功能.‘GSHOCK’及‘OCEANUS’等经典产品也不例外.力争在数年内,使之像现在的电波手表功能一样实现普及”(卡西欧计算机羽

WPF学习------XAML 语法详述

XAML 语言规范 XAML 语言规范中也定义或引用了此处定义的 XAML 语法术语. XAML 是一种基于 XML 并遵循或扩展 XML 结构规则的语言. 其中某些术语共享自或基于描述 XML 语言或 XML 文档对象模型时常用的术语. 有关 XAML 语言规范的更多信息,请从 Microsoft 下载中心下载 [MS-XAML]. XAML 和 CLR XAML 是一种标记语言. 顾名思义,公共语言运行时 (CLR) 实现了运行时执行. XAML 本身并非 CLR 运行时直接使用的一种公共语

.NET开发规范

一.命名规则 1.1 命名法说明 (1)    Pascal命名法:将标识符的首字母和后面连接的每个单词的首字母都大写. 例如:BackColor (2)    Camel命名法:标识符的首字母小写,而每个后面连接的单词的首字母都大写. 例如:backColor (3)    变量.类名.成员变量.方法等命名,禁止采用:英文和拼音组合.拼音命名.非规范的英文简写命名.汉字命名(特殊情况除外:如部分枚举采用汉字): 说明:名字定义不怕长,力求准确,并且可读性友好: 反例:decimal jiage

Linux 内核编码规范

1. 内核注释Documentation/kernel-doc-nano-HOWTO.txt 和 脚本 scripts/kernel-doc 2. 内核编码规范scripts/checkpatch.pl 用来检查驱动编码规范 3. 内核打印<linux/device.h>里有一些驱动模型诊断宏,对于设备相关的打印: dev_err(), dev_warn(), dev_info()等等. 对于不和特定设备相关的<linux/kernel.h>定义了 pr_debug()和 pr_i