2010-04-05 5 views
1

Je m'arrache les cheveux en essayant de comprendre pourquoi la commande que j'exécute via Java en utilisant un ProcessBuilder & Le processus ne fonctionne pas. Je cours la "même" commande à la ligne de commande de Windows et cela fonctionne comme prévu. Il doit être qu'ils ne sont pas les mêmes mais je ne peux pas pour la vie de moi expliquer pourquoi.Exécution de la commande via Java ProccesBuilder Différent à l'exécution de la même dans le shell

La commande est la suivante:

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

La sortie est doit être une chaîne unique de la ligne que je dois saisir et définir comme une variable d'environnement (d'où le v utilisation de base du BufferedReader.).

code Java Mon, qui, lorsqu'il exécute la commande obtient une erreur d'application, ressemble à ceci avec point d'entrée étant 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; 

} 

La sortie du System.err.println(...) est:

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

Est-ce que cela fait une différence si vous divisez chaque option/valeur en tant qu'entrées séparées dans la liste 'command'? Par exemple ajouter "-n" et "USERNAME" en tant qu'entrées séparées (ultérieures)? – Ash

+0

pouvez-vous nous montrer l'erreur que vous obtenez? – ninesided

Répondre

1

I pense que vous devez fournir chaque argument séparément, et sans les espaces avant/arrière, plutôt que de concaténer les uns des autres, par exemple "-pw PASSWORD". De cette façon, vous appellerez le processus avec le jeu d'arguments correct (comme il le verra depuis la ligne de commande)

+0

Doh! Aurait dû le savoir. Merci. –

Questions connexes