2010-04-05 129 views
1

我在試圖弄清楚爲什麼我使用ProcessBuilder通過Java執行的命令&進程無法工作。我在Windows命令行上運行「相同」命令,並按預期工作。一定是因爲他們不一樣,但我不能爲我的生活找出原因。通過Java ProccesBuilder運行命令與在Shell中運行命令不同

該命令是這樣的:

ccm start -nogui -m -q -n ccm_admin -r developer -d /path/to/db/databasename -s http://hostname:8400 -pw Passw0rd789$ 

輸出是應該是我需要抓住並設置爲環境變量一行字符串(因此在V基本使用BufferedReader的)。

我的Java代碼,當它運行該命令獲取一個應用程序錯誤,看起來是這個切入點是startCCMAndGetCCMAddress()

private static String ccmAddress = ""; 

private static final String DATABASE_PATH = "/path/to/db/databasename"; 
private static final String SYNERGY_URL = "http://hostname:8400"; 

private static final String USERNAME = "ccm_admin"; 
private static final String PASSWORD = "Passw0rd789$"; 
private static final String USER_ROLE = "developer"; 


public static List<String> getCCMStartCommand() { 
    List<String> command = new ArrayList<String>(); 

    command.add("cmd.exe"); 
    command.add("/C"); 

    command.add("ccm"); 
    command.add("start"); 
    command.add("-nogui"); 
    command.add("-m"); 
    command.add("-q"); 
    command.add("-n "+USERNAME); 
    command.add("-r "+USER_ROLE); 
    command.add("-d "+DATABASE_PATH); 
    command.add("-s "+SYNERGY_URL); 
    command.add("-pw "+PASSWORD); 

    return command; 
} 

private static String startCCMAndGetCCMAddress() throws IOException, CCMCommandException { 
    int processExitValue = 0; 

    List<String> command = getCCMStartCommand(); 

    System.err.println("Will run: "+command); 

    ProcessBuilder procBuilder = new ProcessBuilder(command); 
    procBuilder.redirectErrorStream(true); 
    Process proc = procBuilder.start(); 
    BufferedReader outputBr = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

    try { 
     proc.waitFor(); 
    } catch (InterruptedException e) { 
     processExitValue = proc.exitValue(); 
    } 

    String outputLine = outputBr.readLine(); 
    outputBr.close(); 

    if (processExitValue != 0) { 
     throw new CCMCommandException("Command failed with output: " + outputLine); 
    } 

    if (outputLine == null) { 
     throw new CCMCommandException("Command returned zero but there was no output"); 
    } 

    return outputLine; 

} 

System.err.println(...)的輸出是:

Will run: [cmd.exe, /C, ccm, start, -nogui, -m, -q, -n ccm_admin, -r developer, -d /path/to/db/databasename, -s http://hostname:8400, -pw Passw0rd789$] 
+1

如果在'command'列表中將每個選項/值分隔爲單獨的條目,它會有什麼區別嗎?例如,添加「-n」和「USERNAME」作爲單獨的(後續)條目? – Ash 2010-04-05 08:38:37

+0

你能告訴我們你得到的錯誤嗎? – ninesided 2010-04-05 08:48:37

回答

1

我認爲你需要分別提供每個參數分別爲,並且沒有前導/尾隨空格,而不是連接選擇的空格,例如「-pw密碼」。這樣你就可以使用正確的參數集調用進程(如從命令行看到的那樣)

+0

<拍額頭> Doh!應該知道這一點。謝謝。 – 2010-04-05 08:56:48