2013-06-20 5 views
1

Я пытаюсь написать программу, которая скомпилирует другой Java-файл из командной строки. Однако у меня проблема с этим. На этом этапе он успешно выполняет первую часть, где он компилирует Mocha.java. Однако я хочу, чтобы он также выполнял этот файл и отображал, что он выводит. Он ничего не отображает. Какие-либо предложения?Выполнение двух команд с помощью построителя процессов

pb = new ProcessBuilder("javac","Mocha.java"); 
    try { 
     Process shell = pb.start(); 
     OutputStream shellOut = shell.getOutputStream(); 
     shellOut.write("java Mocha".getBytes()); 
     shellOut.close(); 
     InputStream shellIn = shell.getInputStream(); 
     String response = IOUtils.toString(shellIn, "UTF-8"); 
     System.out.println(response); 
     shellIn.close(); 
     shell.destroy(); 
    } catch (IOException ex) { 
     System.out.println("failed"); 
    } 

Примечание:

Я также попытался иметь все аргументы Initally так:

pb = new ProcessBuilder("javac","Mocha.java","&&","java","Mocha"); 

Но не только это не работа, это даже не компилировать Mocha.java, как это было выше.

Спасибо!

EDIT:

Так что я изменил это, чтобы сделать два процесса. Прекрасно работает, ребята! Для всех, кто интересуется:

pb = new ProcessBuilder("javac","Mocha.java"); 
    try { 
     Process shell = pb.start(); 
     int error = shell.waitFor(); 
     shell.destroy(); 
     if (error == 0) 
     { 
      pb = new ProcessBuilder("java","Mocha"); 
      shell = pb.start(); 
      InputStream shellIn = shell.getInputStream(); 
      String response = IOUtils.toString(shellIn, "UTF-8"); 
      System.out.println(response); 
      shellIn.close(); 
      shell.destroy(); 
     } 
    } catch (IOException ex) { 
     System.out.println("failed"); 
    } catch (InterruptedException ex) { 
    } 
+2

Примечание: вы должны _at очень делать 'уровнем избыточности Thread.currentThread() прерывания()' 'при ловле InterruptedException'.. – fge

+0

Я ценю это, я об этом не думал. – eatonphil

ответ

1

Это нормально: две команды означают два процесса. Вам нужно два ProcessBuilder s и проверить возвращаемое значение первого процесса перед выполнением второго.

Синтаксис:

new ProcessBuilder("javac","Mocha.java","&&","java","Mocha"); 

не работает. && является логическим оператором , команда javac этого не понимает. Сделайте свою логику обработки в Java напрямую, вместо этого:

if (p1.waitFor() == 0) // compile succeeded 
    // initiate second process 
+0

Интересно. Можете ли вы увидеть мое редактирование? – eatonphil

+0

Получил это, неважно. Я думал, что метод waitFor не должен возвращать ноль. – eatonphil

+0

@phileaton хорошо, он возвращает код выхода команды, вызванной процессом (говорит Javadoc);) – fge

1

Синтаксис, упомянутый, работает с оболочкой, а не с java ProcessBuilder.

Первый вариант - запустить оболочку и выполнить команду оболочки. Другой - дважды обращаться к ProcessBuilder. Один для javac другой для java

+0

Что вы подразумеваете под оболочкой запуска и командой оболочки? Есть ли другой способ сделать это на Java? Из всего, что я видел, ProcessBuilder был единственным приемлемым (не-устаревшим) способом сделать это? – eatonphil

+0

(Но наличие двух процессов тоже имеет смысл.) – eatonphil

+0

@phileaton Он имеет в виду использование ProcessBuilder для создания процесса оболочки вместо процесса javac, а затем выполнения javac в оболочке, как вы пытались (но вы запутались, потому что вы забыли что оболочка сама по себе является процессом, а не какой-то магической штукой, а ProcessBuilder фактически не запускает процесс оболочки, а только процесс javac). – kutschkem

Смежные вопросы