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」と出力するだけですが、このコードでは何も出力されません。何が問題ですか ?
いくつかのチェックを含めるようにコードを変更しました:
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」と表示されますが、少なくとも、プロセスの実行中に何が起こっているかを正確に確認できます。
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();
}
}
}
あなたもする必要があります
pro2.waitFor();
そのプロセスの実行には時間がかかり、プロセスが完了する前にexitValue()を取得できないためです。