javaprocessruntime.exec

how to compile & run java program in another java program?


I have a Main.java and Test.java classes that I want to compile and run Main.java in Test.java code. Here is my code

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

I just print "ok" in Main.java but this code doesn't print anything. What is the problem ?


Solution

  • I have modified the code to include some checks:

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

    Here is the Main.java:

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

    When everything is fine, it just works:

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

    Now, for example, if I have some error 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
    

    It still prints "ok" because the previously compiled Main.class is still there, but at least you can see what exactly is happening when your processes are running.