2013-07-08 3 views
5

Я запускаю процесс следующим образом.Перенаправление ввода-вывода подпроцесса в Java (почему не работает 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() выглядел многообещающим, но, видимо, я не понимаю, как это работает. Я надеялся, что кто-то здесь может пролить свет на это.

+0

Что произойдет, если в cmd.exe вы выполните 'mvn -version> somefile.txt'? – ARRG

+0

@ARRG Я получаю файл с именем somefile.txt с информацией о версии maven – Rinke

+0

1) Прочитайте (и реализуйте) * все * рекомендации [Когда Runtime.exec() не будет] (http://www.javaworld.com /jw-12-2000/jw-1229-traps.html). Это может решить проблему. Если нет, он должен предоставить дополнительную информацию о причине отказа. Затем проигнорируйте, что он ссылается на 'exec' и (продолжает) сборку' Process' с помощью 'ProcessBuilder'. 2) Изменить код формы 'catch (Исключение e) {..' to' catch (Исключение e) {e.printStackTrace(); // очень информативно! ..' –

ответ

2

Может быть, это вариант для чтения его из подпроцесса:

Добавьте этот код после start() и вы будете иметь напечатанный на стандартный вывод:

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 (Перенаправление. INHERIT). Он устанавливает источник и назначение для стандартного ввода-вывода подпроцесса таким же, как и для текущего процесса Java.

Смежные вопросы