Khi tôi chạy kiến từ dòng lệnh, nếu tôi gặp lỗi, tôi nhận được trạng thái thoát khác không ($? Trên UNIX,% ERRORLEVEL% trên Windows). Nhưng chúng ta có một chương trình Java đang chạy ant (thông qua ProcessBuilder), và khi ant không thành công, trên Windows chúng ta không thể có được trạng thái thoát.Tại sao ant.bat không trả lại trạng thái lỗi khi chạy theo chương trình?
Tôi chỉ xác nhận điều này với đơn giản tập tin này ant test:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
Trên UNIX, chạy in ant một thông báo lỗi, và lặp lại $? sau đó in 1. Trên Windows, chạy kiến hoặc ant.bat in thông báo lỗi và lặp lại% ERRORLEVEL% sau đó in 1.
Bây giờ, sử dụng chương trình thử nghiệm dưới đây: Trên UNIX, java Chạy ant in a failure và nhắn lại $? sau đó in 1. Trên Windows, java Chạy kiến không thể tìm thấy một chương trình có tên là ant để chạy, nhưng java Chạy ant.bat in một thông báo lỗi, nhưng lặp lại% ERRORLEVEL% sau đó in . Đưa cái gì?
Chúng tôi đang dựa vào việc có thể kiểm tra trạng thái thoát sau khi chạy ant. Dù sao thì chúng tôi cũng vậy. Tại sao chúng ta không thể dựa vào điều này, lập trình?
chương trình thử nghiệm:
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 là phức tạp và chạy chương trình java trực tiếp tương ứng phức tạp. Tôi thấy cùng một vấn đề thực thi ant.bat từ bên trong một kịch bản kiến (không, đừng hỏi). Tôi không thể nhìn thấy lỗi ant.bat. Tôi không muốn cung cấp ant2.bat cho môi trường của nhà xây dựng, nhưng tôi sẽ phải làm thế. Có ai biết * tại sao * tính năng này hoạt động không? PS: Đánh dấu định dạng cho nhận xét này là gì ??? –