コマンドラインから ant を実行して失敗すると、ゼロ以外の終了ステータスが返されます (UNIX では $?、Windows では %ERRORLEVEL%)。しかし、(ProcessBuilder を介して) ant を実行している Java プログラムがあり、ant が失敗すると、Windows では終了ステータスを取得できません。
この単純な ant テスト ファイルでこれを確認しました。
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
UNIX では、ant を実行すると失敗メッセージが出力され、$? がエコーされます。Windows では、ant または ant.bat を実行すると失敗メッセージが出力され、後で %ERRORLEVEL% をエコーすると 1 が出力されます。
ここで、以下のテスト プログラムを使用します。 UNIX では、java Run ant は失敗メッセージを出力し、$? Windows では、java Run ant は実行する ant という名前のプログラムを見つけることができませんが、java Run ant.bat は失敗メッセージを出力しますが、後で %ERRORLEVEL% をエコーすると0が出力されます。何を与える?
ant の実行後に終了ステータスを確認できることに依存しています。とにかく、私たちはそうでした。プログラム的にこれに頼ることができないのはなぜですか?
テストプログラム:
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;
}
}
}