Я работаю над программой, написанной на Java, которая для некоторых действий запускает внешние программы, используя настраиваемые пользователем командные строки. В настоящее время он использует Runtime.exec()
и не сохраняет ссылку Process
(запущенные программы являются либо текстовым редактором, либо архивной утилитой, поэтому нет необходимости в потоках системы /out/err ).
Есть небольшая проблема с этим, хотя в том, что когда программа Java выходит, она не прекращается, пока все запущенные программы не будут завершены.
Я бы очень хотел, чтобы запущенные программы были полностью независимы от JVM, которые их запускали.
Целевая операционная система является множественной, поскольку Windows, Linux и Mac являются минимальными, но любая система GUI с 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. Я закрываю этот вопрос, поскольку проблема существует только в моей среде разработки; это не проблема в производстве. Из тестовой программы в одном из ответов и последующем тестировании, которое я провел, я удовлетворен тем, что это не проблема, которую может наблюдать любой пользователь программы на любой платформе.