丈夫志四海,万里犹比邻。这篇文章主要讲述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属性传递参数。有以下两种方式传递参数:
- < arg value="https://www.songbingjia.com/android/-c ls -a">
- < arg line="-c ls -a">
【实例】 假如我们扩充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了:
【ant脚本的一些总结】
< ?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="https://www.songbingjia.com/android/-c" />
< arg value="https://www.songbingjia.com/android/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>
推荐阅读
- easyui——datebox控件限制输入的日期
- 使用es的head插件进行简单搜索
- log4j 不打印异常堆栈
- ConcurrentMap.putIfAbsent(key,value) 用法
- ActiveMQ Message Persistence
- spring4.1.8扩展实战之四(感知spring容器变化(SmartLifecycle接口))
- hadoop各种发行版本
- 分布式系统架构演进
- spring依赖注入引发的一点思考