как скомпилировать и запустить java-программу в другой java-программе?
У меня есть Main.java и тест.Java-классы, которые я хочу скомпилировать и запустить Main.java в тесте.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);
}
Я просто печатаю " ok " в Main.java, но этот код ничего не печатает. В чем проблема ?
3 ответов
Я изменил код, чтобы включить некоторые проверки:
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();
}
}
}
вот главная.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
он по-прежнему печатает "ok", потому что ранее скомпилированный Main.класс все еще существует, но, по крайней мере, вы можете видеть, что именно происходит, когда ваши процессы работают.
вы должны
pro2.waitFor();
потому что выполнение этого процесса займет некоторое время, и вы не можете принять exitValue() до завершения процесса.
Я добавил условие в основную функцию класса Laj, чтобы проверить, успешно ли завершен процесс компиляции или нет..
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();
}
}
}