我正在使用Gradle任务运行一些curl代码,我注意到如果我两次访问进程的文本,那么第二次访问总是失败。我注意到通过将process.text传递给XlmSlurper()。如果我第一次打印出process.text它会在啜饮时崩溃,如果我没有打印它然后啜饮的工作。 这里有一些代码说明了这种行为。首先是失败的任务版本:
task hello {
println "****** HELLO ******"
def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
process.waitFor()
println "err.text"
println process.err.text
println "process.text 1 is:"
println process.text
println "process.text 2 is:"
println process.text
}
执行此操作时,输出为:
****** HELLO ******
err.text
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 141 0 85 100 56 2412 1589 --:--:-- --:--:-- --:--:-- 2428
process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121144</long>
process.text 2 is:
Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
java.lang.IllegalArgumentException: android.compileSdkVersion is missing!
at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:80)
at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.groovy:462)
但如果最后两条println行被注释掉,那么它就会成功:
task hello {
println "****** HELLO ******"
def process = ['curl', '-X', 'POST', '-H', 'Accept: Application/xml', '-H', 'Content-Type: application/json', "http://itemid.sea.redacted.com/item_ids", '-d', '{"user":"Y2VxYnVpbGRhZ2VudDpCdTFsZCE=","request":"guid"}'].execute()
process.waitFor()
println "err.text"
println process.err.text
println "process.text 1 is:"
println process.text
// println "process.text 2 is:"
// println process.text
}
哪个有输出:
****** HELLO ******
err.text
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 141 0 85 100 56 1977 1303 --:--:-- --:--:-- --:--:-- 2023
process.text 1 is:
<?xml version="1.0" encoding="utf-8"?><long xmlns="http://redacted.com/">121145</long>
:help
Welcome to Gradle 2.2.1.
To run a build, run gradlew <task> ...
To see a list of available tasks, run gradlew tasks
To see a list of command-line options, run gradlew --help
BUILD SUCCESSFUL
为什么添加/删除那些最后的printlns造成了这样的差异?
(还有为什么:在第二个版本的输出中有帮助......)
在这两种情况下,我都是使用./gradlew
从命令行运行如果使用getText()而不是text /
,则会出现同样的问题答案 0 :(得分:2)
此功能的文档说:
public static String getText(Process self)抛出IOException
阅读Process的输出流文本。关闭所有 检索文本后与流程关联的流。
读取标准输出直到EOF,然后作为String返回。该值未缓存,第二次调用到达封闭流,并失败。
此外,在groovy中,process.getText()
相当于process.text
答案 1 :(得分:1)
您将获得一个只能读取一次的流。将其写入文件或变量&amp;然后根据需要从该文件/变量中多次读取它。