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

4
我正在我的应用程序内部执行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个回答

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");

谢谢!我已经尝试过重定向。但是当我从Windows的cmd运行它时,它可以正常工作。然而,当我使用exec或进程构建器时,我的应用程序就会停止,什么也不会发生,所以我必须终止它。有什么建议吗? - Little Jeans
很难说得确定。尝试重定向到文件。执行后是否包含任何内容? - khachik
请看一下我的更新,我做得对吗?使用 cmdexec 命令都没有找到任何文件。 - Little Jeans
虽然 NIL 对我仍然无效,但我已决定将错误和输出流放到单独的线程中。感谢您的帮助。 - Little Jeans
Processз±»дё­жІЎжњ‰exitCode()ж–№жі•пјЊеЏЄжњ‰exitValue()ж–№жі•гЂ‚ - Little Jeans

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);

谢谢,它有效。如果我需要一个独立于操作系统的解决方案怎么办? - Little Jeans
你可以检查"os.name"系统属性(System.getProperty)并调用适当的shell命令(sh或cmd)。或者一个小技巧:在Unix/Linux中创建一个名为"cmd"的链接,指向shell命令... - user85421

1

查看Process类

您可以调用proc.waitFor()返回一个整数值。但是,您必须确保程序的所有输出都被正确处理(例如使用proc.getInputStream()方法)。


1
你尝试过 proc.exitValue() 吗?

0
你可以使用Java的ProcessBuilder类来执行这些文件。

0

额...什么?这样做:

int response = (int)(getClass().getClassLoader().findClass("Test").
        getMethod("someStaticMethod", new String[]{}).
        invoke(null, new Object[]{}));

这会调用类“Test”的静态方法“int someStaticMethod()”,该类会被动态加载。


你可能并不总是想在自己的JVM内调用类,尽管这样更有效率。但是,为什么不直接调用Test.sameStaticMethod()呢? - Marc
@Marc:也许在编译时,类名是未知的? - thejh
@thejh 你可能想要在一个单独的JVM中执行Java代码,以避免32位内存限制。 - khachik
我必须按照给定的类名和位置调用类。 - Little Jeans
@thejh,我将 location 加入类路径:java -cp %location% Test - Little Jeans
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接