2011-01-30 15 views
26

Tengo clases Main.java y Test.java que quiero compilar y ejecutar Main.java en el código Test.java. Aquí está mi códigocómo compilar y ejecutar el programa java en otro programa 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); 
    } 

Acabo de imprimir "ok" en Main.java pero este código no imprime nada. Cuál es el problema ?

+0

Parece que estás buscando http://docs.codehaus.org/display/JANINO/Home;). – phihag

+0

@phihag es solo un ejemplo de código java. Lo generalizaré con código c/C++ y ohters –

+0

¿No se supone que debes usar 'Process.getOutputStream'? –

Respuesta

29

he modificado el código para incluir algunas comprobaciones:

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

Aquí es el Main.java:

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

Cuando todo está bien, simplemente funciona:

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

Ahora, por ejemplo, si tengo algún error en 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 

Todavía se imprime "ok" porque la clase principal previamente compilada todavía está allí, pero al menos se puede ver exactamente lo que está sucediendo cuando se están ejecutando los procesos.

+0

+1. Puse estos dos archivos en el mismo paquete. Fue mi error. Gracias Sergey –

+0

si hay 'int i = System.in.read();' en el archivo 'Main.java'? –

+0

@Addy, luego debe usar 'getOutputStream()' en el segundo proceso para alimentar al proceso los datos que necesita. O simplemente cierre esa secuencia para que el proceso obtenga EOF de inmediato. –

0

También es necesario

pro2.waitFor(); 

debido a la ejecución de dicho proceso tomará algún tiempo y no se puede tomar la exitValue() antes de que el proceso ha terminado.

+0

Hice esto bu esto también no doy ninguna respuesta –

+0

@hilal, realmente necesitas hacerlo después de tu último ciclo. Lees la salida del proceso mientras se está ejecutando, está bien, pero puedes acceder a exitValue() solo después de que haya finalizado. –

+0

@Sergey puede publicar la respuesta que contiene el código correcto? –

0

he añadido la condición en la función principal de clase Laj para comprobar si hay proceso de compilación se ha completado con éxito 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

a responder, cuidado de aclarar? – rockinfresh

Cuestiones relacionadas