Как запустить полностью независимый процесс из Java-программы?
Я работаю над программой, написанной на Java, которая,для некоторых действий, запускает внешние программы, используя настроенные пользователем командные строки. В настоящее время он используетRuntime.exec()
и не сохраняетProcess
ссылка (запущенные программы являются либо текстовым редактором, либо утилитой архивирования, поэтому система не нуждается в потоках / out / err).
Однако есть небольшая проблема: когда программа Java завершается, она не завершается, пока не завершатся все запущенные программы.
Я бы очень предпочел, чтобы запущенные программы были полностью независимы от JVM, которая их запустила.
Целевая операционная система является множественной, Windows, Linux и Mac являются минимальными, но любая система с графическим интерфейсом пользователя с JVM - это действительно то, что нужно (отсюда настраиваемость пользователем реальных командных строк).
Кто-нибудь знает, как заставить запущенную программу работать полностью независимо от JVM?
Редактировать в ответ на комментарий
Код запуска выглядит следующим образом. Код может запускать редактор, расположенный в определенной строке и столбце, или запускать просмотрщик архива. Значения в кавычках в сконфигурированной командной строке обрабатываются как закодированные в ECMA-262 и декодируются, а кавычки отбрасываются для формирования желаемого параметра exec.
Запуск происходит на EDT.
static Throwable launch(String cmd, File fil, int lin, int col) throws Throwable {
String frs[][]={
{ "$FILE$" ,fil.getAbsolutePath().replace('\\','/') },
{ "$LINE$" ,(lin>0 ? Integer.toString(lin) : "") },
{ "$COLUMN$",(col>0 ? Integer.toString(col) : "") },
};
String[] arr; // array of parsed tokens (exec(cmd) does not handle quoted values)
cmd=TextUtil.replace(cmd,frs,true,"$","$");
arr=(String[])ArrayUtil.removeNulls(TextUtil.stringComponents(cmd,' ',-1,true,true,true));
for(int xa=0; xa<arr.length; xa++) {
if(TextUtil.isQuoted(arr[xa],true)) {
arr[xa]=TextDecode.ecma262(TextUtil.stripQuotes(arr[xa]));
}
}
log.println("Launching: "+cmd);
Runtime.getRuntime().exec(arr);
return null;
}
Похоже, это происходит только тогда, когда программа запускается из моей IDE. Я закрываю этот вопрос, поскольку проблема существует только в моей среде разработки;это не проблема в производстве, Из тестовой программы в одном из ответов и дальнейшего тестирования, которое я провел, я удовлетворен тем, что это не проблема, с которой столкнется любой пользователь программы на любой платформе.