2013-07-08 7 views
5

Sto avviando un processo nel modo seguente.Reindirizzamento I/O del sottoprocesso in Java (perché ProcessBuilder.inheritIO() non funziona?)

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

Dal invoco inheritIO() mi aspettavo di uscita del sotto-processo sulla console, ma non appare nulla. Cosa mi manca qui?

Edit: So che posso usare mvnProcess.getInputStream() e leggere l'output del processo in modo esplicito, la scrittura alla console (o dove-mai) in un ciclo. Non mi piace questa soluzione, tuttavia, poiché il ciclo bloccherà il mio thread. inheritIO() sembrava promettente, ma a quanto pare non capisco come funziona. Speravo che qualcuno qui potesse far luce su questo.

+0

Cosa succede se, nel cmd.exe, si esegue 'mvn --version> somefile.txt'? – ARRG

+0

@ARRG Ricevo un file chiamato somefile.txt con le informazioni sulla versione di maven – Rinke

+0

1) Leggi (e implementa) * tutte * le raccomandazioni di [Quando Runtime.exec() non lo farà] (http://www.javaworld.com /jw-12-2000/jw-1229-traps.html). Questo potrebbe risolvere il problema. In caso contrario, dovrebbe fornire maggiori informazioni sul motivo per cui ha fallito. Quindi ignora che si riferisce a 'exec' e (continua a) costruire il' Processo' usando un 'ProcessBuilder'. 2) Cambia il codice del form 'catch (Exception e) {..' in' catch (Exception e) {e.printStackTrace(); // molto informativo! ..' –

risposta

2

forse è un'opzione la lesse dal sottoprocesso:

Aggiungi il codice dopo start() e lo avrete stampato su 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

Sì, lo so. Funziona (+1). Tuttavia, funziona solo se ometto 'inheritIO()'. Speravo di scoprire come rendere 'inheritIO()' funzionante e di eliminare il ciclo while, perché sta bloccando la mia discussione. – Rinke

0

È possibile utilizzare la .redirectError (Redirect. EREDITARE). Imposta l'origine e la destinazione per l'I/O standard del processo secondario per essere uguale a quello del processo Java corrente.

Problemi correlati