JARパッケージのスタンドアロンアプリケーションがあります。このアプリケーションを実行すると、一時ディレクトリに解凍され、そのディレクトリ内に子プロセスが生成されます。サードパーティのコードと構成が原因で、データファイルは現在の作業ディレクトリに関連して検出され、Javaにはchdir()メソッドがないため、子プロセスの作業ディレクトリを切り替えるしか方法がありません。
システムプロパティを除いて、すべて正常に動作します。オペレーターは、コマンドラインでいくつかのシステムプロパティを指定することを決定できます。これは、標準のプロパティとサードパーティの構成に関連するプロパティの両方です。
java -Djava.io.tmpdir=/temp -Dsomething=else -jar foo.jar (parameters)
親Javaプロセスで使用可能なシステムプロパティは、デフォルトでは子に伝播されません。私はそれを自分でやるべきです。そして、ここで障害になります。どのプロパティがオペレーターによって設定され、どのプロパティがデフォルトでJVMによって初期化されるかを判断する方法がありません。
そのjava.io.tmpdirを1つ取ります。オペレーターがそれを提供した場合、彼にはそうする正当な理由があります(おそらくデフォルトの場所は「ディスクがいっぱい」です)。子プロセスに設定する必要があります。そうしないと失敗します。しかし、それがオペレーターからのものであるかどうかをどうやって知ることができますか?これは単なるデフォルト値である可能性があります。
使用可能なすべてのシステムプロパティを子プロセスに設定しようとする場合があります。ただし、長いリストが必要であり、さらに悪いことに、コマンドラインの長さが制限されている一部の環境では失敗します。
私がこれまでに見つけた唯一の回避策(かなり邪悪なもの)は、引数なしで最初に別の子プロセスを生成し、それが持つすべてのシステムプロパティを親にパイプバックさせることです。親が持っている値と一致する値がデフォルトです。残りは、ワーカーの子プロセスに渡す必要があります。
誰かがより良い選択肢がありますか?