web-dev-qa-db-ja.com

コンパイルして実行する方法Javaプログラムを別のプログラムでJavaプログラム?

Main.JavaおよびTest.Javaクラスがあり、それらをコンパイルして、Main.JavaをTest.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);
    }

Main.Javaで「ok」と出力するだけですが、このコードでは何も出力されません。何が問題ですか ?

26
user467871

いくつかのチェックを含めるようにコードを変更しました:

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

Main.Javaは次のとおりです。

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

すべてが問題なければ、それはうまくいきます:

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

たとえば、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

以前にコンパイルされたMain.classがまだ存在するため、「ok」と表示されますが、少なくとも、プロセスの実行中に何が起こっているかを正確に確認できます。

29
Sergei Tachenov

Lajクラスのmain関数に条件を追加して、コンパイルプロセスが正常に完了したかどうかを確認します。

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

あなたもする必要があります

pro2.waitFor();

そのプロセスの実行には時間がかかり、プロセスが完了する前にexitValue()を取得できないためです。

0
Confusion