私はJavaで書かれたプログラムに取り組んでおり、一部のアクションでは、ユーザーが構成したコマンドラインを使用して外部プログラムを起動します。現在Runtime.exec()
、参照を使用して保持していませんProcess
(起動されたプログラムは、テキストエディタまたはアーカイブユーティリティのいずれかであるため、システムのin / out / errストリームは必要ありません)。
ただし、これには小さな問題があります。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から起動されたときにのみ発生しているようです。問題は私の開発環境にのみ存在するため、この質問を閉じます。本番環境では問題ありません。回答の1つにあるテストプログラムと、私が実施したさらなるテストから、どのプラットフォームのプログラムのどのユーザーにも見られる問題ではないことに満足しています。