用Ant
調(diào)用系統(tǒng)命令
或外部程序
最近用到了Ant,發(fā)現(xiàn)還是有許多功能是Ant沒有提供相應(yīng)Task支持,而操作系統(tǒng)
提供了相應(yīng)的系統(tǒng)命令。
Ant說明書上說了,用<exec>可以調(diào)用系統(tǒng)命令,實際操作起來才發(fā)現(xiàn)陷阱可不少,一不小心就會掉下去。
下面以按日期倒序列舉當前目錄下文件為例說明。
對于Windows平臺,命令是:dir /o:-d
對于Unix(包括Linux
,下同)平臺,命令是 ls –ltr
陷阱1:調(diào)用誰?
這在Ant文檔中已經(jīng)提到了,在Windows下,不能直接調(diào)用dir、del(因為沒有這個程序?。┑龋仨毻ㄟ^cmd.exe來調(diào)用:
<?xml version="1.0" ?>
<project name="testExec" default="test">
<target name="test">
<exec executable="cmd.exe">
<arg line="/c dir"/>
</exec>
</target>
</project>
對于Unix,則可以直接調(diào)用ls:
<?xml version="1.0" ?>
<project name="testExec" default="test">
<target name="test">
<exec executable="ls"/>
</target>
</project>
也可以指明由Shell調(diào)用
<?xml version="1.0" ?>
<project name="testExec" default="test">
<target name="test">
<exec executable="/bin/sh">
<arg line="-c ls" />
</exec>
</target>
</project>
我覺得后者要好一些,否則無法保證調(diào)用的是否系統(tǒng)命令,
因為只要Path環(huán)境變量指明的路徑下有一個同名的程序,都可能被調(diào)用到。
通過Shell調(diào)用,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>
對不起,失?。?a target="_self">java
.lang.IOException。
之所以這樣,是因為<arg line>把每個空格分隔的字符串作為參數(shù)傳給調(diào)用程序,
但是對于”/bin/sh”來說,”ls –ltr”應(yīng)該是一個參數(shù)而不是兩個。
解決辦法有兩個:
加引號:
<?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,調(diào)用一個程序后都必須等到該操作結(jié)束才能繼續(xù)作下面的操作。
如果你想調(diào)用一個程序的同時還做其它的工作
,必須使用<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 指明程序執(zhí)行的路徑。對搜索程序也有影響
os 指明執(zhí)行的平臺
failonerror 缺省為false,即該命令執(zhí)行了但是失敗了,build仍然繼續(xù)
|