我正在开发一个用 Java 编写的程序,对于某些操作,它使用用户配置的命令行启动外部程序。目前它使用Runtime.exec()
并且不保留Process
引用(启动的程序是文本编辑器或存档实用程序,因此不需要系统输入/输出/错误流)。
但这有一个小问题,因为当 Java 程序退出时,它并没有真正退出,直到所有启动的程序都退出。
如果启动的程序完全独立于启动它们的 JVM,我会非常喜欢它。
目标操作系统有多种,Windows、Linux 和 Mac 是最少的,但任何带有 JVM 的 GUI 系统都是真正需要的(因此实际命令行的用户可配置性)。
有谁知道如何使启动的程序完全独立于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 启动程序时才会发生。我要结束这个问题,因为这个问题只存在于我的开发环境中;这在生产中不是问题。从答案之一中的测试程序,以及我进行的进一步测试,我很满意这不是任何平台上程序的任何用户都会看到的问题。