2011-01-30 13 views
26

Ho una classe Main.java e Test.java che voglio compilare ed eseguire Main.java nel codice Test.java. Ecco il mio codicecome compilare ed eseguire il programma java in un altro programma 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); 
    } 

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

+0

Sembra che tu stia cercando http://docs.codehaus.org/display/JANINO/Home;). – phihag

+0

@phihag è solo un esempio di codice java. Lo generalizzerò con codice c/C++ e ohters –

+0

Non dovresti usare 'Process.getOutputStream'? –

risposta

29

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 la Main.java:

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

Quando tutto va bene, funziona:

[email protected]:~/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:

[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 

esso stampa ancora "ok", perché il Main.class precedentemente compilato è ancora lì, ma almeno si può vedere cosa sta succedendo quando i processi sono in esecuzione.

+0

+1. Ho messo questi due file nello stesso pacchetto. È stato un mio errore Grazie Sergey –

+0

se c'è 'int i = System.in.read();' nel file 'Main.java'? –

+0

@Addy, quindi è necessario utilizzare 'getOutputStream()' sul secondo processo per alimentare il processo con i dati necessari. Oppure basta chiudere quel flusso in modo che il processo ottenga EOF immediatamente. –

0

È inoltre necessario

pro2.waitFor(); 

perché l'esecuzione di questo processo richiederà un certo tempo e non si può prendere l'exitValue() prima che il processo è terminato.

+0

Ho fatto questo anche questo non dare alcuna risposta –

+0

@hilal, è effettivamente necessario farlo dopo l'ultimo ciclo. Si legge l'output del processo mentre è in esecuzione, va bene, ma è possibile accedere a exitValue() solo dopo che è stato completato. –

+0

@Sergey puoi pubblicare la risposta che contiene il codice corretto? –

0

ho aggiunto la condizione in funzione principale classe di Laj per verificare processo di compilazione ha completato con successo 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(); 
    } 
    } 
} 
+0

la risposta, vi preghiamo di chiarire ulteriormente? – rockinfresh

Problemi correlati