2013-11-25 3 views
0

У меня есть java-файл jar, который inturn вызывает java-программу (команду).Runtime.getRuntime(). Exec Hangs

Сгенерированная команда отлично работает, когда я запускаю ее в команде promt.

Process proc = Runtime.getRuntime().exec("cmd.exe /C "+ Command); 

     BufferedReader stdIn = new BufferedReader(new 
        InputStreamReader(process.getInputStream())); 

       BufferedReader stdErr = new BufferedReader(new 
        InputStreamReader(process.getErrorStream())); 

      String output=null; 
      while((output=stdIn.readLine())!=null) 
      { 
       System.out.println("output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      while((output=stdErr.readLine())!=null) 
      { 
       System.out.println("error output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      try { 
process.waitFor(); 
.... 
.... 
.... 

Я попытался ProcessBuilder:

ProcessBuilder proc = new ProcessBuilder("cmd.exe", "/C", Command);   proc.redirectErrorStream(true); 
proc.start(); 

Но это бросает ошибку, как:

java.io.IOException: Cannot run program "java -Xmx1024M ......" 
CreateProcess error=2, The system cannot find the file specified 

я могу запустить ту же команду в ПРОМТ, которая работает абсолютно нормально.

ответ

1

С

new ProcessBuilder("cmd.exe", "/C", Command); 

вы использовали перегрузки списков параметров конструктора. Это означает, что команда считается уже проанализированной в аргументах. Тем не менее, вы передаете полный Command как один аргумент, а это значит, что cmd интерпретирует всю командную строку java -Xmx... как просто команду (имя файла) для запуска.

Либо придерживайтесь одной строки, полагаясь на класс ProcessBuilder, чтобы проанализировать ее или предварительно разобрать все.

Что касается вопроса висящей у вас есть, может быть несколько причин:

  • может быть, ваш out поток блокируется;
  • Возможно, программа, с которой вы начинаете писать, составляет stderr, которую вы не читаете, пока не будет слишком поздно (программа закончилась).

Ваш второй подход исправит это, объединив stdout и stderr.

+0

Thank you Marko. Команда такова: «java -Xmx1024M -Djava.util.logging.file =« log // logs.txt »-classpath lib \ tool.jar; lib \ solver.jar com.tool.section.MainFunc -параметр повторного раздела logo.propery C: \ SectionTool «Я не уверен, как передать это в ProcessBuilder сейчас :( – kino

+0

Somethnig like' ("cmd.exe", "/ c", "java", "-Xmx1024m", "-Djava. util.logging.file = log/logs.txt ", и т. д. –

+0

Спасибо Марко.: (ах .. я только что видел поток кода и вижу, что нам нужно следить за тем же кодом, что и сейчас .. означает нам нужно найти решение с Process proc = Runtime.getRuntime(). exec («cmd.exe/C» + Command), только потому, что много кодов уже было написано с использованием BufferedReader, которые придется переписывать, если мы будем использовать ProcessBuilder.К любым способом мы могли бы справиться с этим? – kino

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