我正在从我的应用程序内部执行 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
我正在从我的应用程序内部执行 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
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");
重定向是由 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);
您可以调用proc.waitFor()
以返回一个整数值。但是您必须确保正确处理程序的所有输出(例如使用proc.getInputStream()
方法)。
你试过proc.exitValue()
吗?
您可以使用 Java 的 ProcessBuilder 类来执行这些文件。
呃……什么?这样做:
int response = (int)(getClass().getClassLoader().findClass("Test").
getMethod("someStaticMethod", new String[]{}).
invoke(null, new Object[]{}));
这会调用动态加载的“Test”类的静态方法“int someStaticMethod()”。