您的位置:首页 > 其它

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

2008-04-25 07:05 405 查看
Ant调用系统命令或外部程序 最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。下面以按日期倒序列举当前目录下文件为例说明。注意我使用的是Ant 1.5.4。对于Windows平台,命令是:dir /o:-d对于Unix(包括Linux,下同)平台,命令是 ls –ltr 陷阱1[/b]:调用谁?[/b]这在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[/b]调用,Windows[/b]必须加 /c[/b],Unix[/b]则是加 –c[/b] 。 陷阱2[/b]:arg line[/b], arg value [/b]还有引号[/b]假如我们扩充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[/b]:阻塞(block[/b])[/b]不论是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> 需要注意的属性:[/b]dir 指明程序执行的路径。对搜索程序也有影响os 指明执行的平台failonerror 缺省为false,即该命令执行了但是失败了,build仍然继续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: