Я работаю над программой, написанной на 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. Я закрываю этот вопрос, поскольку проблема существует только в моей среде разработки; это не проблема на производстве . Из тестовой программы в одном из ответов и дальнейшего тестирования, которое я провел, я убежден, что это не проблема, которая будет видна любому пользователю программы на любой платформе.