2013-07-08 4 views
5

私は以下の方法でプロセスを起動します。JavaのサブプロセスのI/Oをリダイレクトする(なぜProcessBuilder.inheritIO()は動作しないのですか)

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

私はinheritIO()を呼び出すので、私は、コンソール上でサブプロセスの出力を期待していたが、何も表示されません。私はここで何が欠けていますか?

編集:私はmvnProcess.getInputStream()を使用し、プロセスの出力を明示的に読んで、ループ内でコンソールに書き込むことができます。私はこのソリューションが好きではありませんが、ループが私のスレッドをブロックするので。 inheritIO()は有望に見えましたが、明らかに私はそれがどのように動作するのか分かりません。私はここに誰かがこれにいくつかの光を当てることを望んでいた。

start()後にこのコードを追加し、あなたはそれがstdoutに印刷されています:

+0

cmd.exeで、 'mvn --version> somefile.txt'を実行するとどうなりますか? – ARRG

+0

@ARRG mavenのバージョン情報であるsomefile.txtというファイルを取得します。 – Rinke

+0

1)[Runtime.exec()を実行しない場合](* http://www.javaworld.com)の推奨事項をすべて読み、実装します。 /jw-12-2000/jw-1229-traps.html)。それは問題を解決するかもしれない。そうでない場合は、失敗した理由に関する詳細情報を提供する必要があります。次に 'exec'を参照し、' ProcessBuilder'を使用して 'Process'をビルドする(引き続き)ことを無視します。 2) 'catch(Exception e){..'という形式のコードをcatch(Exception e){e.printStackTrace();}に変更します。 //非常に有益! .. .. –

答えて

2

は、多分それはオプションのサブプロセスからそれを読んで

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

はい、私は知っています。それは働く(+1)。しかし、 'inheritIO()'を省略すると動作します。私は 'inheritIO()'を動作させ、whileループを取り除く方法を見つけることを望んでいました。これはスレッドをブロックしているからです。 – Rinke

0

あなたはリダイレクト(.redirectErrorを使用することができます。インヘリット)。 サブプロセス標準I/Oのソースとデスティネーションを現在のJavaプロセスのソースとデスティネーションと同じに設定します。

関連する問題