我正在从我的应用程序中执行Java类。
proc = Runtime.getRuntime().exec("java Test");
如何识别Test
是否成功执行(即没有例外)?
重定向输出/错误:
proc = Runtime.getRuntime().exec(new String[] {
"java",
mclass,
">NUL 2>test.txt"
});
来自cmd
:
java Main >NUL 2>test.txt
答案 0 :(得分:7)
process.waitFor();
int exitCode = process.exitValue();
if(exitCode == 0) { // success }
else { // failed }
如果Test
设计正确并返回适当的退出代码(如果出现问题则通常为> 0),这是有效的。
如果您想获取Test
输出/错误消息以确定错误,您应该获得proc.getInputStream()
(这将返回子进程的输出流),proc.getErrorStream()
和从分离线程中的输入流中读取。
请注意,如果子进程写入错误/输出流并且没有读取器,则会阻止子进程。因此,在任何情况下读取过程的错误/输出流都是有用的。
避免子阻塞的另一个选择是将其错误/输出重定向到文件和/或/dev/null
(Windows的'NUL'):
Runtime.exec("java Test >/dev/null 2>&1");
Runtime.exec("java Test >/dev/null 2>erroroutput");
答案 1 :(得分:2)
重定向由shell处理器完成,而不是Runtime.exec()
(至少不在Windows上)
您需要通过cmd.exe
执行命令:
String command = "cmd /c java -classpath D:\\dev\\temp\\ Main >NUL 2>test.txt";
proc = Runtime.getRuntime().exec(command);
答案 2 :(得分:1)
您可以调用proc.waitFor()
返回一个整数值。但是你必须确保正确处理程序的所有输出(例如使用proc.getInputStream()
方法)。
答案 3 :(得分:1)
您是否尝试过proc.exitValue()
?
答案 4 :(得分:0)
呃...什么?这样做:
int response = (int)(getClass().getClassLoader().findClass("Test").
getMethod("someStaticMethod", new String[]{}).
invoke(null, new Object[]{}));
这将调用动态加载的“Test”类的静态方法“int someStaticMethod()”。
答案 5 :(得分:0)
您可以使用ProcessBuilder类java来执行这些文件。