Tôi đang khởi chạy quy trình theo cách sau.Chuyển hướng I/O của tiến trình con trong Java (tại sao ProcessBuilder.inheritIO() không hoạt động?)
try {
final Process mvnProcess = new ProcessBuilder("cmd", "/c", "mvn", "--version")
.directory(new File(System.getProperty("user.dir")))
.inheritIO()
.start();
System.exit(mvnProcess.waitFor());
} catch (final IOException ex) {
System.err.format(IO_EXCEPTION);
System.exit(1);
} catch (final InterruptedException ex) {
System.err.format(INTERRUPTED_EXCEPTION);
System.exit(1);
}
Vì tôi gọi inheritIO()
Tôi đang mong đợi đầu ra của quy trình phụ trên bảng điều khiển nhưng không có gì xuất hiện. Tôi đang thiếu gì ở đây?
Chỉnh sửa: Tôi biết rằng tôi có thể sử dụng mvnProcess.getInputStream()
và đọc kết quả của quá trình một cách rõ ràng, ghi nó vào bảng điều khiển (hoặc ở đâu đó) trong một vòng lặp. Tôi không thích giải pháp này tuy nhiên, kể từ khi vòng lặp sẽ chặn thread của tôi. inheritIO()
trông đầy hứa hẹn, nhưng dường như tôi không hiểu nó hoạt động như thế nào. Tôi đã hy vọng một ai đó ở đây có thể làm sáng tỏ điều này.
Điều gì xảy ra nếu, trong cmd.exe, bạn thực hiện 'mvn --version> somefile.txt'? – ARRG
@ARRG Tôi nhận được một tệp có tên somefile.txt với thông tin phiên bản của maven – Rinke
1) Đọc (và triển khai) * tất cả * các đề xuất của [Khi Runtime.exec() sẽ không] (http://www.javaworld.com /jw-12-2000/jw-1229-traps.html). Điều đó có thể giải quyết vấn đề. Nếu không, nó sẽ cung cấp thêm thông tin vì lý do nó không thành công. Sau đó bỏ qua nó đề cập đến 'exec' và (tiếp tục) xây dựng' Process' bằng cách sử dụng một 'ProcessBuilder'. 2) Thay đổi mã của biểu mẫu 'catch (Exception e) {..' thành' catch (Exception e) {e.printStackTrace(); // rất thông tin! ..' –