2011-01-30 2 views
26

У меня есть классы Main.java и Test.java, которые я хочу скомпилировать и запустить Main.java в коде Test.java. Вот мой кодКак скомпилировать и запустить java-программу в другой программе Java?

Process pro1 = Runtime.getRuntime().exec("javac Main.java"); 
    pro1.waitFor(); 
    Process pro2 = Runtime.getRuntime().exec("java Main"); 

    BufferedReader in = new BufferedReader(new InputStreamReader(pro2.getInputStream())); 
    String line = null; 

    while ((line = in.readLine()) != null) { 
     System.out.println(line); 
    } 

Я просто печатаю «ok» в Main.java, но этот код ничего не печатает. В чем проблема ?

+0

Похоже, что вы ищете http://docs.codehaus.org/display/JANINO/Home;). – phihag

+0

@phihag это просто пример кода Java. Я обобщу его с помощью кода c/C++ и ohters –

+0

Разве вы не должны использовать 'Process.getOutputStream'? –

ответ

29

Я изменил код, чтобы включить некоторые проверки:

public class Laj { 

    private static void printLines(String name, InputStream ins) throws Exception { 
    String line = null; 
    BufferedReader in = new BufferedReader(
     new InputStreamReader(ins)); 
    while ((line = in.readLine()) != null) { 
     System.out.println(name + " " + line); 
    } 
    } 

    private static void runProcess(String command) throws Exception { 
    Process pro = Runtime.getRuntime().exec(command); 
    printLines(command + " stdout:", pro.getInputStream()); 
    printLines(command + " stderr:", pro.getErrorStream()); 
    pro.waitFor(); 
    System.out.println(command + " exitValue() " + pro.exitValue()); 
    } 

    public static void main(String[] args) { 
    try { 
     runProcess("javac Main.java"); 
     runProcess("java Main"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Вот Main.java:

public class Main { 
    public static void main(String[] args) { 
    System.out.println("ok"); 
    } 
} 

Когда все в порядке, он просто работает:

[email protected]:~/tmp$ java Laj 
javac Main.java exitValue() 0 
java Main stdout: ok 
java Main exitValue() 0 

Теперь, например, если у меня есть ошибка в Main.java:

[email protected]:~/tmp$ java Laj 
javac Main.java stderr: Main.java:3: package Systems does not exist 
javac Main.java stderr:  Systems.out.println("ok"); 
javac Main.java stderr:   ^
javac Main.java stderr: 1 error 
javac Main.java exitValue() 1 
java Main stdout: ok 
java Main exitValue() 0 

Он по-прежнему печатает «хорошо», потому что ранее скомпилированный Main.class все еще существует, но по крайней мере вы можете видеть, что именно происходит, когда ваши процессы запущены.

+0

+1. Я помещаю эти два файла в один и тот же пакет. Это была моя ошибка. Спасибо Сергею –

+0

, если есть 'int i = System.in.read();' в файле 'Main.java'? –

+0

@Addy, тогда вам нужно использовать 'getOutputStream()' для второго процесса, чтобы обеспечить обработку данных, которые ему нужны. Или просто закройте этот поток, чтобы процесс сразу получил EOF. –

0

Вы также должны

pro2.waitFor(); 

, потому что выполнение этого процесса потребуется некоторое время, и вы не можете взять exitValue() до завершения процесса.

+0

Я сделал это, это тоже не дает ответа –

+0

@hilal, вам действительно нужно сделать это после вашего последнего цикла. Вы читаете процесс, пока он работает, все в порядке, но вы можете получить доступ к exitValue() только после его завершения. –

+0

@Sergey вы можете опубликовать ответ, содержащий правильный код? –

0

Я добавил условие в классе Ладж основной функции для проверки процесса компиляции была успешно завершена или нет ..

public class Laj { 

    private static void printLines(String name, InputStream ins) throws Exception { 
    String line = null; 
    BufferedReader in = new BufferedReader(
     new InputStreamReader(ins)); 
    while ((line = in.readLine()) != null) { 
     System.out.println(name + " " + line); 
    } 
    } 

    private static int runProcess(String command) throws Exception { 
    Process pro = Runtime.getRuntime().exec(command); 
    printLines(command + " stdout:", pro.getInputStream()); 
    printLines(command + " stderr:", pro.getErrorStream()); 
    pro.waitFor(); 
    // System.out.println(command + " exitValue() " + pro.exitValue()); 
    return pro.exitValue(); 
    } 

    public static void main(String[] args) { 
    try { 
    int k = runProcess("javac Main.java"); 
    if (k==0) 
    k=runProcess("java Main"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

ответ, позаботиться о дальнейшем уточнении? – rockinfresh

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

  • Нет связанных вопросов^_^