2010-04-05 2 views
1

ProcessBuilder를 사용하여 Java를 통해 실행중인 명령이 작동하지 않는 이유는 무엇입니까? & 프로세스가 작동하지 않습니다. Windows 명령 줄에서 "동일한"명령을 실행하면 예상대로 작동합니다. 그것들은 똑같지는 않지만 나는 내 삶이 왜 힘든 일을 할 수는 없다.Java를 통해 명령 실행하기 ProccesBuilder 셸에서 다른 명령을 실행하는 것과 다릅니다

명령이있다 :

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

출력 I 쥐고 환경 변수로 설정해야 할 한 줄 스트링이어야이다 (따라서 V를 BufferedReader의 기본적인 사용.). 이 명령은 응용 프로그램 오류를 가져옵니다 실행

내 자바 코드는 진입 점 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

+0

오류 메시지가 표시 될 수 있습니까? – ninesided

답변

1

I 각각의 인수 을 별도로으로 제공해야하며, "-pw PASSWORD"와 같이 선택 항목을 연결하는 대신 앞에/뒤에 공백을 넣지 않아도된다고 생각하십시오. 그렇게하면 올바른 인수 세트로 프로세스를 호출 할 수 있습니다 (명령 행에서 볼 수 있듯이)

+0

<이마를 때리면> Doh! 그걸 알아야 했어. 감사. –