2010-12-05 3 views
4

Я выполняю Java-класс изнутри своего приложения.Runtime.getRuntime(). 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 

ответ

7
process.waitFor(); 
int exitCode = process.exitValue(); 
if(exitCode == 0) { // success } 
else { // failed } 

Это работает, если Test спроектирована правильно и возвращает соответствующие коды выхода (как правило,> 0, если что-то пошло не так).

Если вы хотите получить Test сек сообщения выхода/ошибку, чтобы определить, что было неправильно, вы должны получить proc.getInputStream() (это возвращает поток вывода дочернего процесса), proc.getErrorStream() и читать из входных потоков в разделенных потоках.

Обратите внимание, что дочерний процесс будет заблокирован, если он будет записывать в поток ошибок/вывода, и нет считывателей. Поэтому чтение ошибок/выходных потоков процесса полезно в любом случае.

Другой вариант, чтобы избежать блокировки ребенка, чтобы перенаправить ошибку/вывод в файл и/или к /dev/null («NUL» для окон):

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

Errr ... что? Сделайте это так:

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

Это вызывающую статический метод «Int someStaticMethod()» класса «Test», который получает загружен динамически.

+0

Возможно, вы не всегда можете вызвать класс внутри своей собственной JVM, хотя это более эффективно. Опять же, почему бы просто не вызвать `Test.sameStaticMethod()`? – Marc 2010-12-05 09:49:46

+0

@Marc: Может быть, имя класса неизвестно во время компиляции? – thejh 2010-12-05 09:52:03

+0

@thejh Возможно, вы захотите выполнить Java-код в отдельной JVM, чтобы избежать, например, ограничения на 32-разрядную память. – khachik 2010-12-05 09:53:12

1

See the Process class

Вы можете вызвать proc.waitFor() вернуть целое значение. Но вы должны убедиться, что все выходные данные программы обработаны правильно (например, используйте метод proc.getInputStream()).

1

вы пробовали proc.exitValue()?

2

Перенаправление выполняется процессором оболочки, а не Runtime.exec() (по крайней мере, не в Windows).
Вы должны выполнить вашу команду на cmd.exe:

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

Вы можете использовать класс ProcessBuilder Явы, чтобы выполнить эти файлы.

Смежные вопросы