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

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

请参阅Process类

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

你试过proc.exitValue()吗?

呃…什么? 这样做:

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

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

您可以使用ProcessBuilder类来执行这些文件。