Runtime.getRuntime()。exec(),执行Java类

时间:2010-12-05 09:42:22

标签: java runtime.exec

我正在从我的应用程序中执行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

6 个答案:

答案 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)

See the Process class

您可以调用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来执行这些文件。