當我從命令行運行ant時,如果出現故障,我會得到一個非零的退出狀態(UNIX上爲$ ?, Windows上爲%ERRORLEVEL%)。但是我們有一個正在運行ant的Java程序(通過ProcessBuilder),當螞蟻失敗時,在Windows上我們無法獲得退出狀態。爲什麼在編程運行時ant.bat不會返回錯誤狀態?
我只是用這個簡單的螞蟻測試文件驗證了這一點:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
在UNIX上,運行ant打印失敗的消息,並呼應$?隨後打印1. 在Windows上,運行ant或ant.bat打印失敗消息,並呼應%ERRORLEVEL%之後Prints立即1.
,使用下面的測試程序: 在UNIX上,Java運行Ant打印出故障消息,並回顯$?之後打印1. 在Windows上,java運行ant無法找到一個名爲ant的程序來運行,但是java運行ant.bat會打印一條失敗消息,然後回顯%ERRORLEVEL%打印。是什麼賦予了?
我們依靠運行螞蟻后能夠檢查退出狀態。無論如何,我們是。爲什麼我們不能依靠這個,以編程方式?
測試程序:
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;
}
}
}
ant.bat比較複雜,直接運行java程序相當複雜。我看到了在ant腳本中執行ant.bat的相同問題(不,請不要問)。我看不到ant.bat錯誤級別。我不想將ant2.bat傳遞給我的構建者環境,但是如果必須的話,我會這樣做。 有誰知道*爲什麼*這個工程? PS:什麼是此評論的格式標記? – 2010-10-20 17:34:46