4

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 (i.e. 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

6 Answers 6

7
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 Tests 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");
Sign up to request clarification or add additional context in comments.

5 Comments

Thank you! I've tried redirecting. But when I run it from windows cmd, it works fine. Whereas when I use exec or process builder, my application just stops and nothing happens, so I have to terminate it. Any advice?
It is difficult to say definitely. Try to redirect to a file. Does it contain anything after execution?
Please, take a look at my update. Am I doing it right? File contains nothing either using cmd or exec.
Well, although NIL still does not work for me, I've decided to put error & output streams to separate threads. Thanks for your help.
just to not confuse future readers. There is no exitCode() method in Process class. Only exitValue().
2

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

2 Comments

Thanks, it works. What if I have to have OS-independent solution?
you can check the "os.name" system property (System.getProperty) and call the appropriate shell command (sh or cmd). Or a little hack: in Unix/Linux create a link called "cmd" that points to the shell command...
1

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 (e.g. use the proc.getInputStream() method).

Comments

1

Have you tried proc.exitValue() ?

Comments

0

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.

7 Comments

You might not always want to call the class inside your own JVM, though this is more efficient. Then again, why not just call Test.sameStaticMethod()?
@Marc: Maybe the class name is unknown at compilation time?
@thejh You may want to execute java code in a separated JVM to avoid 32bit memory limitation, for example.
I have to call the class in given location by given classname.
@Little Jeans: Why don't you put it in the classpath?
|
0

You may use ProcessBuilder class of java to execute these files.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.