2013-07-08 38 views
5

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.

+0

Điều gì xảy ra nếu, trong cmd.exe, bạn thực hiện 'mvn --version> somefile.txt'? – ARRG

+0

@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

+0

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! ..' –

Trả lời

2

Có lẽ nó là một lựa chọn các đọc nó từ tiến trình con:

Thêm mã này sau start() và bạn sẽ có nó in để stdout:

InputStream is = mvnProcess.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String line; 
    while ((line = br.readLine()) != null) 
    { 
     System.out.println(line); 
    } 
+2

Vâng, tôi biết. Nó hoạt động (+1). Tuy nhiên, nó chỉ hoạt động nếu tôi bỏ qua 'inheritIO()'. Tôi đã hy vọng tìm hiểu làm thế nào để làm cho 'inheritIO()' làm việc và thoát khỏi vòng lặp while, bởi vì nó chặn luồng của tôi. – Rinke

0

Bạn có thể sử dụng .redirectError (Redirect. THỪA KẾ). Nó đặt nguồn và đích cho I/O tiêu chuẩn quy trình con giống như quy trình Java hiện tại.

Các vấn đề liên quan