Quando eseguo form dalla riga di comando, se ottengo un errore, ottengo uno stato di uscita diverso da zero ($? Su UNIX,% ERRORLEVEL% su Windows). Ma abbiamo un programma Java che sta eseguendo ant (tramite ProcessBuilder), e quando la formica fallisce, su Windows non possiamo ottenere lo stato di uscita.Perché ant.bat non restituisce uno stato di errore quando viene eseguito a livello di codice?
Ho appena verificato questo con questo semplice file di test ant:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
Su UNIX, in esecuzione stampe formica un messaggio di errore, e facendo eco $? stampa dopo 1. In Windows, in esecuzione formica o ant.bat stampa un messaggio di errore, e facendo eco% ERRORLEVEL% dopo stampe 1.
Ora, utilizzando il programma di prova di seguito: Su UNIX, Java Run stampe formica un fallimento messaggio e echo $? stampe successive 1. Su Windows, java Run ant non è in grado di trovare un programma chiamato formica da eseguire, ma java Run ant.bat stampa un messaggio di errore, tuttavia echoing% ERRORLEVEL% dopo stampa . Cosa dà?
Stiamo facendo affidamento sulla possibilità di controllare lo stato di uscita dopo aver eseguito ant. Eravamo, comunque. Perché non possiamo fare affidamento su questo, a livello di codice?
programma di test:
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 è complesso e l'esecuzione del programma java direttamente è corrispondentemente complessa. Sto vedendo lo stesso problema eseguire ant.bat da uno script ant (no, non chiedere). Non riesco a vedere l'errore ant.bat. Non voglio consegnare ant2.bat all'ambiente del mio costruttore, ma lo farò se dovessi farlo. Qualcuno sa * perché * questo funziona? PS: Qual è il codice di formattazione per questo commento ??? –