Запуск команды через Java ProccesBuilder В отличие от запуска того же самого в командной консоли - PullRequest
1 голос
/ 05 апреля 2010

Я рву голову, пытаясь понять, почему команда, которую я выполняю через Java с помощью ProcessBuilder & Process, не работает. Я запускаю команду «та же» в командной строке Windows, и она работает, как и ожидалось. Должно быть, они не одинаковы, но я не могу понять, почему.

Команда такая:

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 Ответ

1 голос
/ 05 апреля 2010

Я думаю, вам нужно предоставить каждый аргумент отдельно , без пробелов в начале / конце, вместо объединения выбранных, например, "-pw ПАРОЛЬ" Таким образом, вы вызовете процесс с правильным набором аргументов (как это будет видно из командной строки)

...