2013-07-08 18 views
5

Rozpoczęcie procesu w następujący sposób.Przekierowanie operacji wejścia/wyjścia podprocesu w Javie (dlaczego proces ProcessBuilder.inheritIO() nie działa?)

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); 
} 

Odkąd powołać inheritIO() Spodziewałem wyjście Sub-process jest na konsoli, ale nic nie pojawia. Czego tu mi brakuje?

Edit: wiem, że mogę używać mvnProcess.getInputStream() i czytać wyjście procesu jest wyraźnie, pisząc go do konsoli (lub w ogóle), w pętli. Nie podoba mi się to rozwiązanie, ponieważ pętla zablokuje mój wątek. inheritIO() wyglądał obiecująco, ale najwyraźniej nie rozumiem, jak to działa. Miałem nadzieję, że ktoś tutaj może rzucić trochę światła na to.

+0

Co się stanie, jeśli w pliku cmd.exe wykonasz 'mvn --version> somefile.txt'? – ARRG

+0

@ARRG Dostaję plik o nazwie somefile.txt z informacjami o wersji dla maven – Rinke

+0

1) Przeczytaj (i zaimplementuj) * wszystkie * zalecenia [Kiedy Runtime.exec() nie będzie] (http://www.javaworld.com /jw-12-2000/jw-1229-traps.html). To może rozwiązać problem. Jeśli nie, powinien podać więcej informacji na temat przyczyny niepowodzenia. Następnie zignoruj, że odnosi się do 'exec' i (kontynuuj) buduj' Process' używając 'ProcessBuilder'. 2) Zmień kod postaci 'catch (Exception e) {..' na' catch (Exception e) {e.printStackTrace(); // bardzo informujące! ..' –

Odpowiedz

2

Może jest to opcja odczytu go z podproces:

Dodaj ten kod po start() i trzeba będzie ona drukowana na standardowe wyjście:

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

Tak, wiem. Działa (+1). Działa to jednak tylko wtedy, gdy pomijam 'inheritIO()'. Miałem nadzieję, że dowiem się, jak wykonać 'inheritIO()' i pozbyć się pętli while, ponieważ blokuje ona mój wątek. – Rinke

0

Można użyć .redirectError (przekierowanie. DZIEDZICZYĆ). Ustawia źródło i miejsce docelowe dla standardowych operacji we/wy podprocesu na takie same, jak w bieżącym procesie Java.