当我在命令行运行ant,如果我失败了,我得到一个非零退出状态($?在UNIX,Windows上的%ERRORLEVEL%)。 但是,我们有正在运行的蚂蚁(通过的ProcessBuilder)的Java程序,当蚂蚁失败,在Windows上我们无法获得退出状态。
我只是验证了这本简单的蚂蚁测试文件:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
在UNIX上,运行ant打印失败的消息,并呼应$? 之后打印1.在Windows中,运行ant或ant.bat打印失败消息,并呼应%ERRORLEVEL%之后打印1。
现在,使用下面的测试程序:在UNIX上,Java运行蚂蚁打印失败的消息,并呼应$? 随后打印1.在Windows,Java运行蚂蚁无法找到一个程序名为ant运行,但Java运行ant.bat打印失败的消息,但呼应%ERRORLEVEL%之后打印0。 是什么赋予了?
我们依靠能够运行蚁后检查退出状态。 我们,反正。 为什么我们不能靠这个,编程?
测试程序:
import java.io.*;
public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(args);
Process p = pb.start();
ProcThread stdout = new ProcThread(p.getInputStream(), System.out);
ProcThread stderr = new ProcThread(p.getErrorStream(), System.err);
stdout.start();
stderr.start();
int errorLevel = p.waitFor();
stdout.join();
stderr.join();
IOException outE = stdout.getException();
if (outE != null)
throw(outE);
IOException errE = stdout.getException();
if (errE != null)
throw(errE);
System.exit(errorLevel);
}
static class ProcThread extends Thread {
BufferedReader input;
PrintStream out;
IOException ex;
ProcThread(InputStream is, PrintStream out) {
input = new BufferedReader(new InputStreamReader(is));
this.out = out;
}
@Override
public void run() {
String line;
try {
while ((line = input.readLine()) != null)
out.println(line);
} catch (IOException e) {
setException(e);
}
}
private void setException(IOException e) {
this.ex = e;
}
public IOException getException() {
return ex;
}
}
}