Не могу выполнить javac или другие приложения командной строки в Java, используя ProcessBuilder под Windows 7 - PullRequest
0 голосов
/ 13 февраля 2011

Я пытаюсь выполнить javac из Java, используя ProcessBuilder, но я не получаю вывод и ничего не происходит.Я попытался прочитать входной поток (так как есть ошибка, когда процесс зависает, если я его не читаю), но все равно безрезультатно.Первоначально я передал все необходимые параметры в javac, но он не работал, поэтому я упростил его до просто javac (который должен напечатать сообщение справки).

я попытался запустить "C: \ Windows \ System32 \ cmd.exe / c C: \\ "Program Files \" \ Java \ jdk1.6.0_23 \ bin \ javac.exe "" C: \\ "Program Files \" \ Java \ jdk1.6.0_23 \ bin \ javac.exe "и окружая весь путь к javac двойными кавычками, но все равно ничего.

Я получаю ошибку

Невозможно запустить программу "C: \ Windows \ System32 \ cmd.exe / c C: \"Программные файлы "\ Java \ jdk1.6.0_23 \ bin \ javac.exe": ошибка CreateProcess = 2, система не может найти указанный файл

, но если я скопирую команду и запусту ее из командной строки,работает нормально.

Мне известно об использовании класса JavaCompiler для компиляции моих файлов, но я бы предпочел сначала решить эту проблему, так как я не могу запустить ни одно приложение dos или файл .bat из Java.Я могу нормально запускать программы с графическим интерфейсом, например notepad.exe.

String[]  commands = new String[]{
             "C:\\Windows\\System32\\cmd.exe  /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
          };

  logger.log(Level.INFO, "About to run javac with the command below:");
  String commandToOutput = "";
  for (String command : commands) {
     commandToOutput += command + " ";
  }
  logger.log(Level.INFO, commandToOutput);



  ProcessBuilder processBuilder = new ProcessBuilder(commands);
  Process p = processBuilder.start();

Редактировать 2

String[] commands = new String[]{
         "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "-d", "\"" + tempDir + "\"", "-classpath", classpath
      };

Редактировать 3

Почему второй массив команд работает, нопервый не ниже.

//this gives me CreateProcess error=5, Access is denied
      commands = new String[]{
                 "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
              };

//this works
      commands = new String[]{
                 "C:\\Windows\\System32\\cmd.exe",
                 "/c",
                 "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe",
              };

Ответы [ 3 ]

2 голосов
/ 13 февраля 2011

Массив строк, передаваемый в ProcessBuilder, должен содержать один аргумент на элемент массива, а не все в одной большой строке.

Попробуйте это:

String[] commands = new String[] 
{
  "C:\\Windows\\System32\\cmd.exe", 
  "/c", 
  "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
};

Кстати: нетнужно вызвать cmd.exe, вы можете передать javac.exe непосредственно в ProcessBuilder

ProcessBuilder builder = new ProcessBuilder(
   "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "\\Path\\To\\MyClass.java"
);
1 голос
/ 13 февраля 2011

Вы должны прочитать с process.getInputStream() сами. Насколько я знаю, вывод процессов не отображается автоматически на стандартный вывод.

0 голосов
/ 13 февраля 2011

Вы используете неправильный метод компоновщика процессов.Используйте одностроковую версию, т.е. не передавайте строковый массив, просто передавайте строку.Версия строкового массива предназначена для случаев, когда вы уже поделили команду на программу, ее параметры и аргументы.В настоящее время он ищет исполняемый файл программы с именем C:\\Windows\\System32\\cmd.exe /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe.

В качестве альтернативы, разделите вашу команду на программу и аргументы в строковом массиве, а затем вы можете использовать версию строителя массива String.

String[] = new String[] {
    "C:\\Windows\\System32\\cmd.exe",
    "/c",
    "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
}

А

...