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

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

 

[html] view plaincopy
  1. <delete file="D:/test/example.txt"/>  
  2. <delete dir="D:/test"/>  

 

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

 

 

[html] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  1. package com.ant.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.tools.ant.BuildException;  
  7. import org.apache.tools.ant.Task;  
  8.   
  9. public class FileCreater extends Task{  
  10.   
  11.     private String fileName;  
  12.       
  13.     public void setName(String fileName){  
  14.         this.fileName = fileName;  
  15.     }  
  16.       
  17.     @Override  
  18.     public void execute() throws BuildException {  
  19.         try {  
  20.             new File(fileName).createNewFile();  
  21.         } catch (IOException e) {  
  22.             log("create file '" + fileName + "' failed!");  
  23.         }  
  24.         log("create file '" + fileName + "' successful!");  
  25.         super.execute();  
  26.     }  
  27. }  

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

 

 

[html] view plaincopy
  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

转载于:https://www.cnblogs.com/luolizhi/p/5514170.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果开发者_苹果优秀开发者实锤 微软VS Code将支持Apple Silicon

原标题&#xff1a;苹果优秀开发者实锤 微软VS Code将支持Apple Silicon【CNMO新闻】前不久&#xff0c;苹果正式推出搭载Apple M1芯片的Mac产品&#xff0c;至此Mac产品线也将采用ARM架构。产品发布会后没多久&#xff0c;微软Visual Studio Code团队发文称&#xff0c;旗下的…

芯片的二线战场:14nm与12nm争夺战

来源&#xff1a;半导体行业观察在半导体制造领域&#xff0c;10nm、7nm及更先进制程的竞争正在变得越来越不激烈&#xff0c;其主要原因自然是投入巨大、风险高&#xff0c;愿意进入的玩家越来越少&#xff0c;目前只剩下台积电、三星和英特尔这三家了&#xff0c;这里显然成为…

python+OpenCV检测条形码

今天看到一篇关于条形码检测的文章&#xff0c;还是存在一些问题的&#xff0c;昨天我陪朋友去取快递的时候&#xff0c;看到了关于条形码检测在现实场景中的应用&#xff0c;于是&#xff0c;便想着实现一波&#xff0c;并且对程序中的一些问题做了一些修改。 首先要确定调用…

快搜浏览器_让微软丢大脸的edge浏览器终于出新版了!

九月份&#xff0c;基于 Chromium 内核的全新微软 Edge 浏览器开启 Beta 版本的测试&#xff0c;我看到使用全新内核的edge浏览器&#xff0c;以及官方加入的 IE 模式、隐私工具等一些更好用的新功能后&#xff0c;我暂时放下用了很长时间的老版本的edge浏览器&#xff0c;投入…

逻辑回归实现多分类任务(python+TensorFlow+mnist)

逻辑回归实现多分类任务&#xff08;pythonTensorFlowmnist&#xff09; 逻辑回归是统计学中的一种经典方法&#xff0c;虽然叫回归&#xff0c;但在机器学习领域&#xff0c;逻辑回归通常情况下当成一个分类任务&#xff0c;softmax就是由其演变而来&#xff0c;逻辑回归一般用…

物理哲学和生物哲学的对抗

来源&#xff1a;科学技术哲学相对论革命在上一讲中&#xff0c;我们提到第二次科学革命始于18世纪后期的化学革命&#xff0c;它的两大标志是&#xff1a;1. 近代西方科学的古典科学传统和培根科学传统融合&#xff0c;西方科学现代化&#xff1b;2. 科学和技术结合&#xff0…

cpu开核_新锐龙让AMD重返巅峰,但逆袭的50年里这些CPU也不应忘记

AMD从成立至今无疑有着许多神奇的经历&#xff0c;比如其创始人一开始只能艰难地筹集到5000美元创业&#xff0c;到如今AMD成为一家年营业额达到65亿美元的公司&#xff0c;这位创始人创始人杰里.桑德斯也赋予了AMD永不放弃&#xff0c;永不投降的精神。曾有过无比辉煌的历史&a…

二隐层的神经网络实现MNIST数据集分类

二隐层的神经网络实现MNIST数据集分类 传统的人工神经网络包含三部分&#xff0c;输入层、隐藏层和输出层。对于一个神经网络模型的确定需要考虑以下几个方面&#xff1a; 隐藏层的层数以及各层的神经元数量各层激活函数的选择输入层输入数据的shape输出层神经元的数量以上神经…

Android之SurfaceView

SurfaceView也是继承了View&#xff0c;但是我们并不需要去实现它的draw方法来绘制自己&#xff0c;为什么呢&#xff1f; 因为它和View有一个很大的区别&#xff0c;View在UI线程去更新自己&#xff1b;而SurfaceView则在一个子线程中去更新自己&#xff1b;这也显示出了它的…

日韩决裂,半导体谁最受伤?

来源&#xff1a; 半导体行业观察日本政府于7月1日公布&#xff0c;要加强对韩国的出口管理&#xff0c;7月4日发起了“氟化聚酰亚胺&#xff08;Polymide&#xff09;”、“EUV Resist&#xff08;光阻剂&#xff09;”、“氟化氢”三种半导体材料的出口限制。根据此次出口限制…

验证码随机生成

验证码随机生成 这里主要使用到的库是captcha库&#xff0c;下载的命令如下&#xff1a; pip install captcha 验证码随机生成代码&#xff0c;(python 版本&#xff1a;3.6 captcha 版本&#xff1a;0.3) from captcha.image import ImageCaptcha import numpy as np …

台式电脑麦克风_还有人买台式PC吗?这份新品推荐攻略值得收藏

【科技犬】新品一&#xff0c;联想发布新款天逸510S台式机联想现已推出天逸 510S 小型主机&#xff0c;搭载了英特尔最新的十代酷睿处理器 i5-10400&#xff0c;8GB 内存 512GB SSD 售价 3499 元。联想新款天逸 510S 将于 7 月 23 日开卖&#xff0c;适合企业办公用户使用。天…

天基物联,毫瓦服务,商业航天撬动万亿市场

来源&#xff1a; 卫星与网络2019年8月17日12时11分&#xff0c;酒泉卫星发射中心&#xff0c;北京国电高科科技有限公司&#xff08;以下简称“国电高科”&#xff09;研制的天启沧州号&#xff08;又名“忻中一号”&#xff09;卫星由首次发射的捷龙一号商业火箭成功送入太空…

GitHub如何上传超过100MB的文件

GitHub如何上传超过100MB的文件 平时在GitHub上上传项目文件时&#xff0c;遇到比较大的文件&#xff0c;就会出现无法上传的情况&#xff1a; this exceeds GitHubs file size limit of 100.00 MB 解决方法如下&#xff1a; 在所要上传文件的目录下打开Git 首先&#xff0c;…

人的智商到底有多高?

图片来源&#xff1a;verywell.com来源&#xff1a;生物谷人的智商到底有多高&#xff1f;来自慕尼黑大学的Markus Buhner教授表示&#xff0c;其实日常生活中我们认为的很多事实实际上或许都是误解&#xff0c;这里&#xff0c;研究人员对8种陈词滥调的有效性证据进行了权衡分…

解决问题:Couldn't open file: data/coco.names

错误&#xff1a;Couldn’t open file: data/coco.names darknet GitHub&#xff1a;https://github.com/pjreddie/darknet YOLO官网&#xff1a;https://pjreddie.com/darknet/yolo/ 在进行yolo效果测试时&#xff0c;出现了该错误。通过如下命令下载darknet&#xff1a; git…

linux系统下codeblocks控制台打印中文乱码

linux系统下codeblocks控制台打印中文乱码 在linux下安装codeblocks后&#xff0c;打印中文出现如下问题&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {printf("你好&#xff0c;世界&#xff01;\n");return 0; } 解决办法 1、将…

db2时间格式化为时间到时分秒_快捷指令为 iPhone 手机照片添加时间水印

安卓手机用户&#xff0c;自带的相机一般都有花样繁多的水印功能&#xff0c;可以将当前使用的手机型号、日期时间、品牌等信息以水印形式添加到照片。而苹果手机自带的相机应用可设置的功能较少&#xff0c;不过&#xff0c;苹果系统自带的“快捷指令”应用扩展功能非常强&…

深度学习仍是视觉大数据领域的最好分析方法之一

在这个数据为王的时代&#xff0c;深度学习擅于发掘多维数据中错综复杂的关系。基于大数据的深度学习算法在计算机视觉、自然语言处理以及信息检索等多个领域不断刷新着记录。来源&#xff1a; AI科技评论AI 科技评论注&#xff1a;本文作者为中国科学院信息工程研究所张晓宇副…

matplotlib调节colorbar的大小

调节plt.colorbar的fraction系数即可调节colorbar的大小 weight np.random.random([8, 8]) plt.imshow(weight) plt.colorbar(fraction0.05, pad0.05) plt.savefig(tjn.png, bbox_inchestight) plt.show()