comment compiler et exécuter un programme en java dans un autre programme java?

J'ai une Main.java et Test.classes java que je veux compiler et exécuter Main.java en Test.le code 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);
    }

Je viens d'imprimer " ok " dans Main.java mais ce code n'imprime rien. Quel est le problème?

26
demandé sur Sergei Tachenov 2011-01-30 14:41:39

3 réponses

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 principal.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 imprime toujours " ok " parce que le principal précédemment compilé.la classe est toujours là, mais au moins vous pouvez voir ce qui se passe exactement lorsque vos processus sont en cours d'exécution.

29
répondu Sergei Tachenov 2011-01-30 13:05:08

Vous devez également

pro2.waitFor();

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

0
répondu Confusion 2011-01-30 11:53:53

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
répondu user3490305 2014-04-02 16:19:58