2013-07-08 12 views
5

aşağıdaki şekilde sürecinin başlatılması ediyorum.Yönlendirme I/Java alt sürecin Ç (neden ProcessBuilder.inheritIO() çalışmıyor?)

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

ben konsolda alt sürecin çıkışını bekliyordum inheritIO() çağırmak, ama hiçbir şey göründüğü beri. Burada neyi özlüyorum?

Düzenleme: Ben bir döngüde konsolunun (veya defa) bunu yazma, ben mvnProcess.getInputStream() kullanmak ve açıkça sürecin çıkışını okuyabilir biliyoruz. Ancak bu çözümü sevmiyorum, çünkü döngü iş parçamı engelleyecektir. inheritIO() umut verici görünüyordu, ama görünüşe göre nasıl çalıştığını anlamıyorum. Birinin burada biraz ışık tutacağını umuyordum.

+0

Eğer cmd.exe dosyasında 'mvn --version> somefile.txt' yazarsanız ne olur? – ARRG

+0

@ARRG ben [zaman Runtime.exec() olmaz] (http://www.javaworld.com ait * Tüm * önerileri) bir Maven'ın sürüm bilgileri – Rinke

+0

1 ile somefile.txt adlı dosyayı) Read olsun (ve uygulamak /jw-12-2000/jw-1229-traps.html). Bu sorunu çözebilir. Aksi takdirde, başarısızlık nedeni ile ilgili daha fazla bilgi sağlamalıdır. Daha sonra, 'Process' ve 'ProcessBuilder' kullanarak 'Process' oluşturmaya atıfta bulunduğunu dikkate almayın. 2) "catch (Exception e) {.." formunun "catch" (Exception e) {e.printStackTrace(); // çok bilgilendirici! .. ' –

cevap

2

Belki bir seçenek alt işlemi okumak geçerli:

start() sonra bu kodu ekleyin ve bunu bekletilmektedir sahip olacaktır:

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

Evet, biliyorum. Çalışır (+1). Ancak, sadece inheritIO() 'yi atladığımda çalışır. “InheritIO()” çalışmasını nasıl yapacağımızı ve while döngüsünden kurtulmayı umuyordum çünkü iş parçamı engelliyor. – Rinke

0

Sen .redirectError (yönlendir kullanabilirsiniz. devralır). Alt işlem standart I/O için kaynak ve hedefi geçerli Java sürecininkiyle aynı olacak şekilde ayarlar.

İlgili konular