最近用到了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仍然繼續
轉自:http://www.cnblogs.com/halfacre/admin/EditPosts.aspx?opt=1
