简体   繁体   中英

Runtime.getRuntime().exec(), executing Java class

I am executing Java class from inside my application.

proc = Runtime.getRuntime().exec("java Test");

How can I recognize whether Test executed successfully or not (ie no exceptions)?


Redirecting output / error:

proc = Runtime.getRuntime().exec(new String[] {
    "java",
    mclass,
    ">NUL 2>test.txt"
});

From cmd :

java Main >NUL 2>test.txt
process.waitFor();
int exitCode = process.exitValue();
if(exitCode == 0) { // success }
else { // failed }

This works, if the Test is designed properly and returns appropriate exit codes (generally, >0 if something went wrong).

If you want to get Test s output/error message to determine what was wrong, you should get proc.getInputStream() (this returns the output stream of the child process), proc.getErrorStream() and read from the input streams in separated threads.

Note that the child process will get blocked if it writes to error/output stream and there are no readers. So reading error/output streams of the process is useful in any cases.

Another option to avoid child blocking is to redirect its error/output to a file and/or to /dev/null ('NUL' for windows):

Runtime.exec("java Test >/dev/null 2>&1");
Runtime.exec("java Test >/dev/null 2>erroroutput");

Redirection is done by the shell processor, not by Runtime.exec() (at least not on Windows).
You need to execute your command by cmd.exe :

String command = "cmd /c java -classpath D:\\dev\\temp\\ Main >NUL 2>test.txt";
proc = Runtime.getRuntime().exec(command);

See the Process class

You can call proc.waitFor() to return an integer value. But you have to make sure that all output of the program is handled correctly (eg use the proc.getInputStream() method).

您是否尝试过proc.exitValue()

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

Errr... what? Do it this way:

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

This invokes the static method "int someStaticMethod()" of the class "Test" which gets loaded dynamically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM