如何通过Groovy AntBuilder以编程方式获取Ant exec任务的进程退出码
在Groovy AntBuilder中获取exec任务的退出码
问题描述
我尝试通过Ant的exec任务执行命令后获取退出码,但通过ant.properties访问设置的resultproperty时返回null。以下是我的代码示例:
import groovy.ant.AntBuilder def cmd = 'ls -l' def ant = new AntBuilder() ant.echo('Hello, Ant Builder!') ant.exec(executable: 'bash', resultproperty: 'my.cmd.exitCode') { arg(value: '-c') arg(value: cmd) } ant.echo('Exit code is ${my.cmd.exitCode}') // 以下代码返回null def cmdExitCode = ant.properties['my.cmd.exitCode'] println "Exit code: ${cmdExitCode}" println "Properteis: ${ant.properties}"
执行后的部分输出:
[echo] Hello, Ant Builder! [exec] total 64 ... [echo] Exit code is 0 Exit code: null Properteis: [saveStreams:true, current:null, antXmlContext:org.apache.tools.ant.helper.AntXMLContext@78411116, class:class groovy.ant.AntBuilder, antProject:org.apache.tools.ant.Project@aced190, project:org.apache.tools.ant.Project@aced190]
Ant官方文档中关于exec的说明:
outputproperty:用于存储命令输出的属性名称。除非错误流重定向到单独的文件或流,否则该属性将包含错误输出。
我不清楚如何在Groovy AntBuilder中以编程方式正确访问这个退出码属性。
解决方案
你需要通过AntBuilder关联的Ant Project实例来访问resultproperty设置的属性,而不是直接访问ant.properties——ant.properties是Groovy AntBuilder自身的属性集合,并非Ant项目的属性容器。
修改后的代码如下:
import groovy.ant.AntBuilder def cmd = 'ls -l' def ant = new AntBuilder() ant.echo('Hello, Ant Builder!') ant.exec(executable: 'bash', resultproperty: 'my.cmd.exitCode') { arg(value: '-c') arg(value: cmd) } ant.echo('Exit code is ${my.cmd.exitCode}') // 改为从antProject中获取属性 def cmdExitCode = ant.antProject.getProperty('my.cmd.exitCode') println "Exit code: ${cmdExitCode}" // 查看Ant项目的属性集合(可选) println "Ant Project Properties: ${ant.antProject.properties}"
关键说明
ant.antProject是Groovy AntBuilder持有的Ant核心Project对象,所有通过Ant任务设置的resultproperty、outputproperty都会存储在这个对象的属性集合中。- 你也可以用
ant.project.getProperty('my.cmd.exitCode'),因为AntBuilder的project属性是antProject的别名。 - 如果需要将属性值转为整数类型,可以用
cmdExitCode.toInteger()处理。
内容的提问来源于stack exchange,提问作者Lawrence Zeng
相关产品推荐
相关产品推荐

