分享
 
 
 

ANT(1.6)高级特性:流程控制

王朝java/jsp·作者佚名  2006-01-30
窄屏简体版  字體: |||超大  

Ant没有引入Shell,比Make少了许多麻烦,但是流程控制(Flow Control)也是不能少的,要不是没法完成复杂的任务的。Ant内置了一些简单的流程控制方法,另外我们可以从外部引入脚本语言实现复杂的流程控制。 Ant内置的流程控制方法

1. depends 在定义一个target的时候,通过depends指定依赖的target,那么在运行这个target之前,这些依赖的target必须都先通过:

<target name="A"/>

<target name="B" depends="A"/>

<target name="C" depends="B"/>

<target name="D" depends="C,B,A"/>

那么,如果只是运行B,A会先被调用;只是运行C,A先被调用,接着是B,再才是C;运行D,A先被调用,接着是B,接着是C,最后是D,注意B和A都只会被调用一次而不是两次。

2. if和unless

在定义一个target的时候,通过if和unless指定依赖的属性。例如:

<?xml version="1.0" ?>

<project name="showFlow" default="showLan" basedir=".">

<property name="isENU" value="true" />

<property name="isCHS" value="false" />

<!--<property name="isJPN" value="false" />-->

<target name="showLan" depends="showENU, showCHS, showJPN"/>

<target name="showENU" if="isENU">

<echo message="This is English" />

</target>

<target name="showCHS" if="isCHS">

<echo message="This is Chinese" />

</target>

<target name="showJPN" if="isJPN">

<echo message="This is Japanese" />

</target>

</project>

只有在调用transENU之前,先定义了属性enu,那么这个Target就会被执行。注意是定义,不论给这个属性赋什么值都行。看一下结果:

unless与if相反,一旦该属性被赋值,那么这个Target就不会被执行。

3. condition

if和unless还是死的,要把相应的属性去掉或加上才能决定是否执行。用condition可以增加一点灵活性:

<?xml version="1.0" ?>

<project name="showFlow" default="showLan" basedir=".">

<target name="showLan">

<property name="lan" value="ENU" />

<condition property="isENU">

<equals arg1="${lan}" arg2="ENU" />

</condition>

<condition property="isCHS">

<equals arg1="${lan}" arg2="CHS" />

</condition>

<condition property="isJPN">

<equals arg1="${lan}" arg2="JPN" />

</condition>

<antcall target="showENU" />

<antcall target="showCHS" />

<antcall target="showJPN" />

</target>

<target name="showENU" if="isENU">

<echo message="This is English" />

</target>

<target name="showCHS" if="isCHS">

<echo message="This is Chinese" />

</target>

<target name="showJPN" if="isJPN">

<echo message="This is Japanese" />

</target>

</project>

结果:

condition任务除了在满足条件时设置一个属性之外什么也不做。这些条件包括not, and, or, available, uptodate, os, equals, isset, checksum, http, socket, filesmatch, contains, istrue, isfalse, isreference。这个设置的属性就可以被用来在调用某个把该属性设置为if/unless的Target进行触发了。

使用脚本语言进行流程控制

使用Ant内置的流程控制,首先是很麻烦,其次是只能进行一些简单的if/unless判断,稍微复杂一点的循环遍历都没法做,对系统的调用更是无法完成。Ant没有自己定义一套脚本,而是引入外部脚本。Ant支持的脚本很多,从JavaScript, Python, Ruby, BeanShell, TCL,到JudoScript,甚至还可以自己定义脚本语言。可惜这岂不是要求又掌握一门语言吗?

下面讲讲怎么用算是比较常见的Mozilla JavaScript。

首先,从http://jakarta.apache.org/bsf/下载BSF,我用的是bsf 2.3.0;再到http://www.mozilla.org/rhino/下载Rhino,我用的是Rhino1.5R3。把jar文件都放到安装目录>\lib目录下。 下面是一个简单的例子: <project name="showScript" default="testScript" basedir="."> <property name="tosplit" value="Just A Test" /> <target name="testScript"> <script language="javascript"> <![CDATA[ a1 = tosplit.split(" "); echo = project.createTask("echo"); for (i = 0; i < a1.length; i++) { echo.setMessage(a1[i]); echo.execute(); } java.lang.System.out.println("Do you like this?"); ]]> </script> </target> </project> 结果:

从例子可以看到: 从例子可以看到: 1) script必须用<script language="语言名称">指明,脚本主体必须用<![CDATA[ 和 ]]> 包起来。 2) 变量s1是JavaScript中的string类型,跟Java中的String类没有关系,因此可以调用split方法。JavaScript的语法?可以查MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsoriJScript.asp

3) Rhino的功能很强大,除了可以JavaScript的语法之外,还可以通过调用Java的类库,这里只是简单调用了System.out.println。实际上,可以象编Java程序写出大块的程序来,当然了,只是调用,能不能定义类?

4) project和self是两个预定义的对象。selft就是当前script任务本身。在当前的build.xml中所有定义了name的对象包括属性、任务、Target都可以用这个名称来引用,比如这里的属性tosplit。这些对象要怎么样操作?查Ant 的JavaAPI,总之只要用Java怎么调这里就可以怎么调,只要你对Ant足够熟悉就行。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有