come compilare ed eseguire il programma java in un altro programma java?

Ho una class Main.java e Test.java che voglio compilare ed eseguire Main.java nel codice Test.java. Ecco il mio codice

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); } 

Ho appena stampato “ok” in Main.java ma questo codice non stampa nulla. Qual è il problema ?

Ho modificato il codice per includere alcuni controlli:

 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(); } } } 

Ecco il Main.java:

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

Quando tutto va bene, funziona solo:

 alqualos@ubuntu:~/tmp$ java Laj javac Main.java exitValue() 0 java Main stdout: ok java Main exitValue() 0 

Ora, ad esempio, se ho qualche errore in Main.java:

 alqualos@ubuntu:~/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 

Stampa ancora “ok” perché il Main.class precedentemente compilato è ancora lì, ma almeno puoi vedere cosa sta succedendo esattamente quando i tuoi processi sono in esecuzione.

È anche necessario

 pro2.waitFor(); 

perché l’esecuzione di tale processo richiederà del tempo e non è ansible prendere exitValue () prima che il processo sia terminato.

Ho aggiunto la condizione nella funzione principale della class Laj per verificare se il processo di compilazione è stato completato correttamente o no.

 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(); } } }