從Ant調用系統命令或外部程序


 

最近用到了Ant,發現還是有許多功能是Ant沒有提供相應Task支持,而操作系統提供了相應的系統命令。Ant說明書上說了,用<exec>可以調用系統命令,實際操作起來才發現陷阱可不少,一不小心就會掉下去。下面以按日期倒序列舉當前目錄下文件為例說明。注意我使用的是Ant 1.5.4

對於Windows平台,命令是:dir /o:-d

對於Unix(包括Linux,下同)平台,命令是 ls –ltr

 

陷阱1:調用誰?

這在Ant文檔中已經提到了,在Windows下,不能直接調用dirdel(因為沒有這個程序!)等,必須通過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必須加 /cUnix則是加 –c

 

陷阱2arg 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM