Wenn ich Ant über die Befehlszeile ausführen, bekomme ich einen Nicht-Null-Beendigungsstatus ($? Unter UNIX,% ERRORLEVEL% unter Windows). Aber wir haben ein Java-Programm, das läuft (über ProcessBuilder), und wenn Ameisen scheitert, können wir unter Windows den Exit-Status nicht bekommen.Warum gibt ant.bat bei der programmgesteuerten Ausführung keinen Fehlerstatus zurück?
Ich überprüfte dies nur mit dieser einfachen ant Testdatei:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
Unter UNIX läuft ant druckt eine Fehlermeldung, und Echo $? danach druckt 1. Unter Windows Ameise läuft oder ant.bat druckt eine Fehlermeldung, und% Error-% Echo später druckt 1.
nun unter dem Testprogramm: Unter UNIX Java ant druckt einen Fehler Nachricht und echo $? nachher druckt 1. Unter Windows kann java Run amt kein Programm mit dem Namen ant zum Ausführen finden, aber java Run ant.bat gibt eine Fehlermeldung aus, aber echo% ERRORLEVEL% druckt danach . Was gibt?
Wir verlassen uns darauf, den Exit-Status nach der Ausführung von ant überprüfen zu können. Wir waren sowieso. Warum können wir uns nicht programmatisch darauf verlassen?
Testprogramm:
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 ist komplex und läuft das Java-Programm direkt ist entsprechend komplex. Ich sehe das gleiche Problem bei der Ausführung von ant.bat innerhalb eines ant-Skripts (nein, frag nicht). Ich kann den ant.bat errorlevel nicht sehen. Ich möchte ant2.bat nicht in die Umgebung meines Herstellers liefern, aber ich werde es tun, wenn ich muss. Weiß jemand * warum * das funktioniert? PS: Was ist die Formatierung Markup für diesen Kommentar ??? –