ant脚本的一些总结

Posted 赶路人儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ant脚本的一些总结相关的知识,希望对你有一定的参考价值。

1、ant中调用os的命令:

 1)可以使用exec标签来调用系统命令,由于ant是跨平台,所以系统既可以是windows也可以linux等。

 2)这在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 。

1)对于-c ,linux中给的解释是:-c string  If the -c option is present, then commands are read from  string.   If  there  are  arguments  after  the string, they are assigned to the positional parameters, starting with $0.

   即:shell会从-c后面的字符串读取命令,然后执行。

 2)例如在linux命令行执行,sh -c ls

 3)在java中调用linux命令也需要这样写:String[] cmd = new String[] "/bin/sh", "-c", "ls" ;

 

2、使用exec标签调用系统命令时,可以使用arg属性传递参数。有以下两种方式传递参数:

  1. <arg  value="-c ls -a">
  2. <arg  line="-c ls -a">

他们的区别是,value后面是一个命令行变量,可以包含空格,但整体作为一个变量传递给程序。line后面接的字符串,会按照空格进行分割,然后作为变量列表传给程序。

【实例】 假如我们扩充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、阻塞:

不论是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>
以上是关于ant脚本的一些总结的主要内容,如果未能解决你的问题,请参考以下文章

Ant 脚本 - 如何从 plist 文件中打印一些文本并将其分配给属性

从Windows下的ANT脚本创建RPM包

有没有办法通过ANT或其他一些构建自动化系统自动生成JWG文件/编译Openscript文件?

如何通过bash脚本检测ant / maven的构建错误?

Ant十五大最佳实践

ANT - PLSQL 执行错误