web-dev-qa-db-fra.com

comment compiler et exécuter le programme Java dans un autre programme Java?

J'ai des classes Main.Java et Test.Java que je veux compiler et exécuter Main.Java dans le code Test.Java. Voici mon 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);
    }

J'imprime juste "ok" dans Main.Java mais ce code n'imprime rien. Quel est le problème ?

26
user467871

J'ai modifié le code pour inclure quelques vérifications:

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

Voici le Main.Java:

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

Quand tout va bien, ça marche:

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

Maintenant, par exemple, si j'ai une erreur dans 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

Il affiche toujours "ok" car la classe Main.class précédemment compilée est toujours là, mais au moins vous pouvez voir ce qui se passe exactement lorsque vos processus sont en cours d'exécution.

29
Sergei Tachenov

J'ai ajouté la condition dans la fonction principale de la classe Laj pour vérifier que le processus de compilation s'est terminé avec succès ou non.

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
user3490305

Vous devez également

pro2.waitFor();

car l'exécution de ce processus prendra un certain temps et vous ne pourrez pas prendre exitValue () avant la fin du processus.

0
Confusion