最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。

对于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仍然继续

最新文章

  1. SolrCloud-5.2.1 集群部署及测试
  2. andorid lint
  3. Nutch插件系统
  4. VS2010 使用 EF5 框架步骤
  5. 寻找第k元
  6. 解决在onCreate()过程中获取View的width和Height为0的方法
  7. spirng底层实现原理
  8. swing Jframe 界面风格
  9. 关于ML.NET v0.7的发布说明
  10. Java开发笔记(三十二)字符型与整型相互转化
  11. APP在线课程设计
  12. git使用记录_备忘
  13. MVC 简介
  14. 201772020113 李清华《面向对象程序设计(java)》第三周学习总结
  15. UOJ33 [UR #2] 树上GCD 【点分治】【容斥原理】【分块】
  16. Java使用Unsafe接口操作数组Demo
  17. HDU 1525 类Bash博弈
  18. MTCNN 实现人脸识别
  19. 一款基于jquery的喜欢动画按钮
  20. Ubuntu下安装CUDA

热门文章

  1. Java-basic-1
  2. 命令行执行Qt程序
  3. POJ:1751-Highways(Kruskal和Prim)
  4. ADB命令后台修改系统默认输入法
  5. Mysql之查看数据库版本
  6. CodeForces 543D 树形DP Road Improvement
  7. webservice soap wsdl简介
  8. Linux的档案权限与目录配置
  9. Java + golang 爬取B站up主粉丝数
  10. Leetcode1---&gt;数组中两数之和等于给定数