2016-07-31 80 views
0
String[] command = { "cmd.exe", "/C", "Start", "skype" }; 
Runtime runtime = Runtime.getRuntime(); 
Process process = runtime.exec(command); 

你好,我想在java中啓動skype!我有這個問題: 我使用上面的代碼,在eclipse中它的工作原理是完美的,但是當我將它編譯爲runnable jar時,它會陷入無限循環,新的java進程將啓動,直到整個java崩潰!Java開始運行時Skype

問題出在這部分代碼中。 (當我評論它一切正常,但Skype沒有啓動)

哪裏可以解決問題?

編輯*

我做節目的小例子:

主要類:

package Client; 

public class DemoMain { 


    public static void main(String[] args) { 
     new Demo(); 
    } 

} 

Process類:

package Client; 

import java.io.IOException; 

public class Demo { 


    public Demo(){ 
     try { 
      Runtime.getRuntime().exec(new String[]{ "cmd.exe", "/C", "Start", "skype" }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

結果:Task Manager view

在eclipse編譯器中它非常棒!問題是程序從Runnable jar啓動時

+0

此代碼正好運行一個命令一次。唯一合乎邏輯的解釋是**代碼**圍繞着這個代碼進行循環。你真的很想創建一個「最小可行」的例子,它會給你錯誤並在這裏發佈完整的代碼。我們無法從正確的代碼中知道你身邊有什麼問題!所以請看幫助中心;瞭解你如何提問,以便我們有機會給你一個有用的答案。 – GhostCat

回答

0

先定義一個批處理文件,然後調用該批處理文件。 定義了一個方法並且不使用構造方法。

public static String os_exec(String[] cmds) 
    { 
     int ret = 0, i = 0; 
     StringBuffer sb = new StringBuffer(); 
     Process process = null; 
     String line = null; 
     BufferedReader bufferedReader = null; 
     try 
     { 
      ProcessBuilder pb = new ProcessBuilder(cmds); 
      pb.redirectErrorStream(true); 
      process = pb.start(); 
      pb.redirectErrorStream(true); 
      bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      while ((line = bufferedReader.readLine()) != null) 
      { 
       i += 1; 
       sb.append(line); 
       if(i > 1) 
       { 
        sb.append("\r\n"); 
       } 
      } 
      ret = process.waitFor(); 
     } 
     catch (Exception e) 
     { 
      StringBuffer err = new StringBuffer(); 
      for(String commond : cmds) 
      { 
       err.append(commond); 
       err.append(' '); 
      } 
      sb.append(e.getMessage()); 
     } 
     finally 
     { 
      if(bufferedReader != null) 
      { 
       try 
       { 
        bufferedReader.close(); 
        process.destroy(); 
       } 
       catch (Exception e) 
       { 
        sb.append(e.getMessage()); 
       } 
      } 
     } 
     return sb.toString(); 
    } 

的start.bat

start C:\skype.exe 

調用os_exec();

String[] command = { "cmd.exe", "start.bat" }; 
os_exec(command); 
+0

是否可以運行保存在.jar中的批處理文件? (在資源中) –

+1

你應該添加日誌並打印異常 –

+0

在我的情況下,我需要bat文件裏面的可運行罐 是否有可能在那裏運行它? –