varios reconoce proyecto programar programa por lotes interno externo ejecutar ejecutable desde consola compilar como comando archivos archivo aplicacion java process runtime.exec

reconoce - ejecutar java desde consola linux



¿Cómo compilar y ejecutar el programa Java en otro programa Java? (3)

He agregado la condición en la función principal de la clase Laj para verificar que el proceso de compilación se haya 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(); } } }

Tengo una clase Main.java y Test.java que quiero compilar y ejecutar Main.java en el código Test.java. Aquí está mi código

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 ?


He modificado el código para incluir algunos controles:

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í está el Main.java:

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

Cuando todo está bien, simplemente funciona:

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

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

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


También necesitas

pro2.waitFor();

porque ejecutar ese proceso llevará algo de tiempo y no puede tomar exitValue () antes de que el proceso haya finalizado.