从Ant调用系统命令或外部程序

从Ant调用系统命令或外部程序
  最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。下面以按日期倒序列举当前目录下文件为例说明。注意我使用的是Ant 1.5.4。
  对于Windows平台,命令是:dir /o:-d
  对于Unix(包括Linux,下同)平台,命令是 ls –ltr
  陷阱1:调用谁?
  这在Ant文档中已经提到了,在Windows下,不能直接调用dir、del(因为没有这个程序!)等,必须通过cmd.exe来调用:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="cmd.exe">
   <arg line="/c dir"/>
   </exec>
   </target>
  </project>
  对于Unix,则可以直接调用ls:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="ls"/>
   </target>
  </project>
  也可以指明由Shell调用
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="/bin/sh">
   <arg line="-c ls" />
   </exec>
   </target>
  </project>
  我觉得后者要好一些,否则无法保证调用的是否系统命令,因为只要Path环境变量指明的路径下有一个同名的程序,都可能被调用到。
  通过Shell调用,Windows必须加 /c,Unix则是加 –c 。
  陷阱2:arg line, arg value 还有引号
  假如我们扩充Windows平台下的例子,满足按修改时间倒序的要求:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="cmd.exe">
   <arg line="/c dir /o-d"/>
   </exec>
   </target>
  </project>
  成功。换Unix了:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="/bin/sh">
   <arg line="-c ls -ltr" />
   </exec>
   </target>
  </project>
  对不起,失败:java.lang.IOException。
  之所以这样,是因为<arg line>把每个空格分隔的字符串作为参数传给调用程序,但是对于”/bin/sh”来说,”ls –ltr”应该是一个参数而不是两个。解决办法有两个:
  加引号:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="/bin/sh">
   <arg line="-c 'ls –ltr'" />
   </exec>
   </target>
  </project>
  或者使用<arg value>:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="/bin/sh">
   <arg value="-c" />
  <arg value="ls -ltr" />
   </exec>
   </target>
  </project>
  陷阱3:阻塞(block)
  不论是Windows还是Unix,调用一个程序后都必须等到该操作结束才能继续作下面的操作。如果你想调用一个程序的同时还做其它的工作,必须使用<parallel>:
  <?xml version="1.0" ?>
  <project name="testExec" default="test">
   <target name="test">
   <exec executable="notepad.exe"/>
   <echo message="You must close notepad first!"/>
  
   <parallel>
   <exec executable="notepad.exe"/>
   <echo message="You do not need to close notepad."/>
   <parallel>
   </target>
  </project>
  需要注意的属性:
  dir 指明程序执行的路径。对搜索程序也有影响
  os 指明执行的平台
  failonerror 缺省为false,即该命令执行了但是失败了,build仍然继续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值