Ant脚本介绍

1、     Ant简介:这里引用Ant帮助文档中对Ant的介绍:

Apache Ant是一个基于Java的构建工具。从理论上讲,也是一种类似于Make的工具,只是去除了Make工具的缺点。
      既然已经有了make, gnumake, nmake, jam以及其他的构件工具,为什么还要Ant呢?因为Ant的早期开发者发现所有以上这些工具都或多或少的有一些局限性,使得在跨平台开发软件成为困难。类似于Make的工具都是传统的基于Shell的--首先进行依赖性检查,然后执行命令。这意味着你可以轻易的通过使用或者编写程序来扩展这些工具,以满足不同的平台。当然,这也意味着你将局限于特定的平台,至少可以说局限于特定类型的平台,例如:Unix平台。

同时,Make文件也有一些先天的缺陷。好多人都会遇到恐怖的tab问题。Ant的最初开发者多次说“我的命令不能执行因为我在tab前面加了一个空格!”。一些工具如Jam一定程序上解决了这个问题,但仍有其它的格式问题。

 Ant与从基于命令的那些扩展开来的那些工具不同,Ant是由java类扩展的。不用编写shell命令,而是配置基于XML的文件,形成多个任务的目标配置树。每一个任务都是通过一个实现了一个规定接口的java类来运行的。
    ant缺少了一些直接执行shell命令的能力,如find . -name foo -exec rm {},但它给用户提供了跨平台的能力,可以在任何地方工作。实际上,Ant也提供了命令execute用来执行shell命令,这就是它的任务,它允许执行基于操作系统的命令。

    简单的说,Ant是一个基于Java,并且主要用于Java工程的构建工具。Ant本意是Another Neat Tool,也就是另一种整洁的工具,取首字符就是Ant。

构建工具就是为了减少重复工作而产生的。

2、     Ant的一些核心概念

XML:构建文件是以XML文件来描述的,采用XML格式有很多好处。这里就不一一列举。

陈述式语法:构建文件短小精悍,且易于理解。

每个构建文件包含一个工程(project)。

每个工程包含若干个目标(target)。

目标可以依赖于其他的目标(depends)。

目标包含任务(task)。

易于使用Java语言增加新的任务---易于扩展(自定义)。

3、     Ant中的关键元素介绍

Ant 的构件文件是基于xml编写的,默认名称为 build.xml 。为了更清楚的了解 Ant ,在这里编写一个简单的Ant 程序,用来展现 Ant 的功能,让读者对 Ant 有一个初步的了解。首先在建立一个 build.xml 文件,内容如下:

<? xml version="1.0" ?>
< project  name ="helloWorld"> < target  name ="sayHelloWorld"> < echo  message ="Hello,Amigo"/>
</ target > 
</ project >

 

Build.bat 默认执行build.xml。

下面以项目中的ant脚本为例粗略介绍一下ant脚本的执行情况及结构。脚本如下:

<?xml version="1.0" ?>
<project name="TPFBL_build" default="war" basedir="."><property name="source_src" value="./src" /><property name="source_conf" value="./conf" /><property name="source_webroot" value="./WebRoot" /><property name="source_lib" value="./WebRoot/WEB-INF/lib" /><property name="source_class" value="./WebRoot/WEB-INF/classes" /><property name="source_webxml" value="./WebRoot/WEB-INF/web.xml" /><property name="TPF_jar" value="./WebRoot/WEB-INF/lib/TPF_BaseLine.jar" /><property name="TPF_war" value="./TPF_BaseLine.war" /><property name="out_lib" value="./lib" /><path id="all-libs"><fileset dir="${source_lib}"><include name="**/*.jar" /></fileset><fileset dir="${out_lib}"><include name="**/*.jar" /></fileset></path><target name="clean" description="Clean all output dirs (build, etc), and release versions"></target><target name="compile" depends="clean"><javac srcdir="${source_src}" destdir="${source_class}" excludes="junit/**" encoding="utf-8"><classpath refid="all-libs" /></javac><copy todir="${source_class}" overwrite="yes"><fileset dir="${source_conf}"></fileset></copy></target><target name="jar" depends="compile"><jar destfile="${TPF_jar}" update="true" includes="**/*.class" excludes="junit/**" basedir="${source_class}"><manifest><attribute name="Built-By" value="huawei" /></manifest></jar></target><target name="war" depends="jar"><war warfile="${TPF_war}" basedir="${source_webroot}" excludes="" webxml="${source_webxml}"><exclude name="WEB-INF/classes/com/**" /></war><delete file="${TPF_jar}" /></target><target name="usage"><echo message="" /><echo message="TPFBL Server build script" /><echo message="-----------------------------------------" /><echo message="" /><echo message="Among the available targets are:" /><echo message="" /><echo message="all jars  --> create all JAR files" /><echo message="release_tomcat   --> make tomcat war" /><echo message="" /><echo message="The base dir is: ${basedir}" /><echo message="-----------------------------------------" /><echo message="Java Version: ${ant.java.version}" /></target>
</project>

 

a)  Project元素

project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。接下来向读者展示一下 project 元素的各属性。

       i.     Name属性

用于指定 project 元素的名称。

      ii.     default属性

用于指定 project 默认执行时所执行的 target 的名称。

    iii.     basedir属性

用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。

从上面的脚本我们可以看出default="war",当运行ant命令时若为指明执行的target时默认执行name="war"的target。

此处设定了basedir=".",所以 basedir 属性的值变成了设置的值(当前目录)。若不设置basedir属性,则basedir目录则为build.xml的父目录。

b)  Target元素

Ant 的基本执行单元,它可以包含一个或多个具体的任务。多个 target 可以存在相互依赖关系。属性介绍:

       i.     Name属性

Ant 的基本执行单元,它可以包含一个或多个具体的任务。多个 target 可以存在相互依赖关系。

      ii.     Depends属性

用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“ , ”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target 。被依赖的 target 会先执行。

    iii.     If属性

用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。

      iv.     Unless属性

该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行

       v.     description属性

该属性是关于 target 功能的简短描述和说明。

      vi.      

c)  Property元素

该元素可看作参量或者参数的定义, project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入: <property file=” build.properties”/> 。

property 元素可用作 task 的属性值。在 task 中是通过将属性名放在“ ${ ”和“ } ”之间,并放在 task 属性值的位置来实现的。

 

d)   

4、     Ant常用任务

在 Ant 工具中每一个任务封装了具体要执行的功能,是 Ant 工具的基本执行单位。

a)  copy任务

该任务主要用来对文件和目录的复制功能。现举例如下:

Eg1. 复制单个文件:

<copy file="file.txt" tofile="copy.txt"/>

Eg2. 对文件目录进行复制:

<copy todir="../newdir/dest_dir"><fileset dir="src_dir" includes="*.jar"/>
</copy>

Eg3. 将文件复制到另外的目录:

<copy file="file.txt" todir="../other/dir"/>

b)  delete任务

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

Eg1. 删除某个文件:

<delete file="photo/*.jar"/>

Eg2. 删除某个目录:

<delete dir="photo"/>

Eg3. 删除所有的备份目录或空目录:

       

 <delete includeEmptyDirs="true">
  <fileset dir="." includes="**/*.bak"/>
</delete>

c)  mkdir任务创建某个指定的目录

<mkdir dir="build/classes" />

d)  move任务 剪切文件

<move todir="some/new/dir"><fileset dir="my/src/dir"><include name="**/*.jar"/><exclude name="**/ant.jar"></fileset>
</move>

5、     Ant的其他介绍略

转载于:https://www.cnblogs.com/lltse/archive/2012/09/07/2675311.html

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

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

相关文章

爱犯错的智能体 – 视觉篇(五):火星人脸的阴影

来源&#xff1a;张军平科学网博客摘要&#xff1a;人类对外星文明的寻找和痴迷自古就有记载。所以&#xff0c;每每看到拍摄于外星球的照片&#xff0c;必然会情绪激动&#xff0c;试图从中获取存在外星人的蛛丝马迹。一、火星人脸人类对外星文明的寻找和痴迷自古就有记载。所…

链表简单实现(增删查改)

链表 关于链表的原理已经有一篇链表文章写的很详细了&#xff0c;这篇文章主要侧重于代码的实现&#xff0c;主要使用go实现。 单链表实现 package Listtype listNode struct {val intnext *listNode }func newNode(val int) *listNode {node : new(listNode)node.val val…

今天不发技术文,发点粉丝福利

一、资料 1、100套小编购买的简历模板&#xff08;部分截图&#xff09; 2、1000套精品PPT模板&#xff08;部分截图&#xff09; 3、大数据-学习资料&#xff08;1.3G 硬核PDF&#xff0c;官方指南&#xff09; 4、python学习全集 5、Java基础、高级和面试资料 6、大数据-行业…

android Context

讲解Context的一篇不错的文章http://www.cppblog.com/life02/archive/2012/03/19/168328.aspx 调用service时需要一个Context实例&#xff01; 1 2 3 4 public void startWifi(Context context) { WifiManager wifiManager (WifiManager)context.getSystemServic…

剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

题目描述 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 题目分析 题中每个节点新增了 random 指针&#xff0c;指向链表…

自动驾驶技术发展的5个阶段和现状

来源&#xff1a;智车科技摘要&#xff1a;自动驾驶的级别从L1到L5&#xff08;SAE&#xff09;&#xff0c;清晰而直观&#xff0c;是大家讨论自动驾驶行业的一个基准。但是&#xff0c;它也很容易误导人。让人以为自动驾驶的技术会一级一级获得突破&#xff0c;最终迎来一辆L…

❤『知识集锦』一文搞懂mysql索引!!(建议收藏)

作者&#xff1a;不吃西红柿 简介&#xff1a;CSDN博客专家、蓝桥签约作者、大数据领域优质创作者。 以我的资历和文凭&#xff0c;将来这个城市的大街&#xff0c;都归我扫。 【系列课程介绍】 『面试知识集锦』系列课程包括以下20个系列&#xff0c;超过100篇文章。每篇文章…

新来报道

刚刚进入博客园&#xff0c;希望自己在技术上更上一层楼&#xff0c;加油。 给自己点鼓励.一切问题都是可以解决的。遇到问题不要后退&#xff0c;要努力&#xff0c;坚持去解决。坚持学习&#xff0c;坚持写博客&#xff0c;从基础写起。 算来算去&#xff0c;自己也工作几年了…

AI芯片的过去、现在与未来

来源&#xff1a;华尔街见闻摘要&#xff1a;AI芯片似乎没能表现得比人类更智能&#xff0c;但它们的学习能力很强&#xff0c;未来可以变得更聪明。算法和芯片系统的设计都可以进步&#xff0c;这需要AI芯片具备更高级的记忆系统和连接机制&#xff0c;以及承载深度学习数据流…

链表(图文详解)

链表的概念 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。   链表的结构是多式多样的&#xff0c;当时通常用的也就是两种&#xff1a;   无头单向非循环列表&#xff1a;结构简单&…

sql join中on条件后接and和where

目录 场景1&#xff1a;left join on a.xx b.xx and a.xx2 aa 场景2&#xff1a;left join on a.xx b.xx and b.xx2 aa 场景3&#xff1a;left join on a.xx b.xx where b.xx2 aa 场景4&#xff1a;inner join on a.xx b.xx where a.xx2 aa 场景5&#xff1a;…

最近学gvim,mark低先

1. vim基本用法&#xff1a;模式&#xff0c;光标移动&#xff0c;查找替换&#xff0c;复制粘贴删除 1.1 帮助 :help :help command 1.2 模式切换 命令模式 Esc, Ctrl-c, 配合光标移动可用Alt-h,Alt-j,Alt-k,Alt-l 编辑模式 i 在当前位置编辑 , a在当前位置后面…

❤「和平精英」被python爬虫了?看看你最适合什么配件!❤

作者简介&#xff1a;不吃西红柿&#xff0c;CSDN博客专家、蓝桥签约作者。 困难像弹簧&#xff0c;你弱它就强&#xff0c;你强它更强。 求点赞、求关注 写作目的&#xff1a; 1、练习爬虫技术&#xff1b; 2、深入了解和平精英枪械属性&#xff0c;提高吃鸡概率。 一、爬前…

(相当全面)node.js 初体验

转载自&#xff1a;http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 最近写的文章收到许多朋友的反馈&#xff0c;感谢大家的支持和建议&#xff0c;让我对坚持写博客充满热情&#xff0c;一个月一篇文章确实有点少&#xff0c;所以以后尽力多做分享&#…

创作表情包(备用)

&#x1f476;&#x1f9d2;&#x1f466;&#x1f467;&#x1f9d1;&#x1f471;&#x1f468;&#x1f9d4;&#x1f468;‍&#x1f9b0;&#x1f468;‍&#x1f9b1;&#x1f468;‍&#x1f9b3;&#x1f468;‍&#x1f9b2;&#x1f469;&#x1f469;‍&#x1f9b0…

安装redis和phpredis模块

redis的下载及安装&#xff1a;ubuntu:/$ mkdir /usr/local/redisubuntu:/$ cd /usr/local/redisubuntu:/$ wget http://redis.googlecode.com/files/redis-2.4.2.tar.gzubuntu:/$ tar xzf redis-2.4.2.tar.gzubuntu:/$ cd redis-2.4.2ubuntu:/$ makeubuntu:/$ src/redis-serve…

深度 | 激光雷达独角兽Quanergy的危急时刻

来源&#xff1a;网易智能编译摘要&#xff1a;全球知名的激光雷达制造商 Quanergy 最近陷入了麻烦之中。早在2014年&#xff0c;Quanergy公司就发现自己正身处于一场对自动驾驶汽车突如其来的狂热之中。Quanergy公司制造了激光雷达技术&#xff0c;这是一种将激光反射到物体上…

R语言【dplyr】——case_when()是一般向量化的 if-else(),该函数允许您将多个 if_else() 语句矢量化

Package dplyr version 1.1.4 Parameters case_when(..., .default NULL, .ptype NULL, .size NULL) 参数【...】&#xff1a;<dynamic-dots> 一组两面公式&#xff08;two-sided formulas&#xff09;。 公式左边&#xff08;left hand side&#xff0c;LHS&#…

❤ 就这?TypeScript其实并不难!(建议收藏)❤

&#x1f388; 作者&#xff1a;不吃西红柿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;、蓝桥签约作者、Python领域优质创作者、信息技术智库公众号创建者✌。技术交流、面试刷题尽管关注咨询我。 热门专栏推荐&#xff1a; &#x1f947; 知识集锦专栏&…

EntityModelStudio系列教程2--静态建模之实体模型设计

在EMStudio中静态建模的概念和内容是来自于UML标准的&#xff0c;所以EMStudio提供的静态建模的设计能力是完全可以满足开发者的设计要求的。但是与UML标准比较&#xff0c;EMStudio中的静态建模还存在两个不同的特色&#xff1a; 1. 类与实体的概念是一致的 也就是说&#xff…