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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
ANT没有引入Shell,比Make少了许多麻烦,但是流程控制(Flow Control)也是不能少的,要不是没法完成复杂的任务的。ANT内置了一些简单的流程控制方法,另外我们可以从外部引入脚本语言实现复杂的流程控制

ANT内置的流程控制方法<?xml:namespace prefix = o />

1.ANT="" font-style="" roman="" new="" times="">  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"/>

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

 

2.ANT="" font-style="" roman="" new="" times=""> ifunless

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

<?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就会被执行。注意是定义,不论给这个属性赋什么值都行。看一下结果:

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

 

3.ANT="" font-style="" roman="" new="" times="">  condition

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

<?xml version="1.0" ?>

<?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/unlessTarget进行触发了。

 

 

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

使用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文件都放到<ANT< span>安装目录>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)  变量s1JavaScript中的string类型,跟Java中的String类没有关系,因此可以调用split方法。JavaScript的语法?可以查MSDNhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsoriJScript.asp

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

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

 

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: java
上一篇Robocode学习笔记(三)
下一篇Robocode学习笔记(四)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭