2013-11-25 7 views
0

inturn이 java 프로그램 (명령)을 호출하는 java jar 파일이 있습니다.Runtime.getRuntime(). exec Hangs

명령 프롬프트에서 실행할 때 생성 된 명령이 올바르게 작동합니다.

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 

내가 절대적으로 잘 작동 PROMT에서 같은 명령을 실행할 수 있습니다.

답변

1

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

사용하면 생성자의 가변 인자 과부하를 사용했습니다. 이것은 명령이 인수로 이미 구문 분석되었다고 가정합니다. 그러나 Command을 하나의 인수로 전달하면 cmd은 전체 명령 줄 java -Xmx...을 실행할 명령 (파일 이름)으로 해석합니다.

ProcessBuilder 클래스를 사용하여 구문 분석하거나 모든 내용을 미리 구문 분석 할 수 있습니다. 당신이 가지고있는 매달려 문제에 관해서는

, 여러 가지 원인이있을 수 있습니다

  • 어쩌면 당신의 out 스트림이 차단;
  • stderr으로 시작하는 프로그램이 이미 너무 늦을 때까지 전혀 읽지 않습니다 (프로그램이 종료되었습니다).

두 번째 방법은 stdoutstderr을 병합하여 해결할 수 있습니다.

+0

Marko. 명령은 다음과 같습니다. "java -Xmx1024M -Djava.util.logging.file ="log // logs.txt "-classpath lib \ tool.jar; lib \ solver.jar com.tool.section.MainFunc -parameter redo section logo.propery C : \ SectionTool "이걸 ProcessBuilder에 어떻게 넘겨 줄지 모르겠다. ( – kino

+0

Somethnig는'("cmd.exe ","/ c ","java ","-Xmx1024m ","-Djava. util.logging.file = log/logs.txt ", 등등. –

+0

감사의 말 Marko : (아 .. 저는 코드 플로우를 보았고 현재와 동일한 코드에서 후속 작업을 수행해야합니다. 우리는 Process proc = Runtime.getRuntime(). exec ("cmd.exe/C"+ Command); 만 사용하여 솔루션을 찾아야합니다. 이것은 BufferedReader를 사용하여 많은 코드가 이미 작성 되었기 때문에 사용하면 다시 작성해야합니다. ProcessBuilder. 이걸로 어떤 방법으로도 통과 할 수 있을까? – kino

관련 문제