2010-04-05 130 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