1

JARパッケージのスタンドアロンアプリケーションがあります。このアプリケーションを実行すると、一時ディレクトリに解凍され、そのディレクトリ内に子プロセスが生成されます。サードパーティのコードと構成が原因で、データファイルは現在の作業ディレクトリに関連して検出され、Javaにはchdir()メソッドがないため、子プロセスの作業ディレクトリを切り替えるしか方法がありません。

システムプロパティを除いて、すべて正常に動作します。オペレーターは、コマンドラインでいくつかのシステムプロパティを指定することを決定できます。これは、標準のプロパティとサードパーティの構成に関連するプロパティの両方です。

java -Djava.io.tmpdir=/temp -Dsomething=else -jar foo.jar (parameters)

親Javaプロセスで使用可能なシステムプロパティは、デフォルトでは子に伝播されません。私はそれを自分でやるべきです。そして、ここで障害になります。どのプロパティがオペレーターによって設定され、どのプロパティがデフォルトでJVMによって初期化されるかを判断する方法がありません。

そのjava.io.tmpdirを1つ取ります。オペレーターがそれを提供した場合、彼にはそうする正当な理由があります(おそらくデフォルトの場所は「ディスクがいっぱい」です)。子プロセスに設定する必要があります。そうしないと失敗します。しかし、それがオペレーターからのものであるかどうかをどうやって知ることができますか?これは単なるデフォルト値である可能性があります。

使用可能なすべてのシステムプロパティを子プロセスに設定しようとする場合があります。ただし、長いリストが必要であり、さらに悪いことに、コマンドラインの長さが制限されている一部の環境では失敗します。

私がこれまでに見つけた唯一の回避策(かなり邪悪なもの)は、引数なしで最初に別の子プロセスを生成し、それが持つすべてのシステムプロパティを親にパイプバックさせることです。親が持っている値と一致する値がデフォルトです。残りは、ワーカーの子プロセスに渡す必要があります。

誰かがより良い選択肢がありますか?

4

3 に答える 3

2

私が働いている場所では、ユーザーが適用できるシステムプロパティのリストが徐々に増えていて、子プロセスについて心配する必要はありませんでしたが、別の問題がありました。単に多すぎるということです。

ユーザーがコマンドラインを介してシステムプロパティを提供する(または、この場合、アプリケーションを起動するスクリプトの行をさらに長くする)のではなく、デフォルトで.propertiesファイルをロードするためのサポートを追加しました。

永続的なプロパティをそこに配置するようにユーザーを説得し、子プロセスを起動してファイルからロードするプロセスを開始できれば、頭痛の種を完全に回避できます。

それでも、ファイルを変更せずに一時的または1回限りのプロパティが必要なデバッグシナリオが表示される可能性があります(実際には大したことではありません)。ここにはいくつかの選択肢があります。

  1. 現在のアプローチを引き続き使用してください。
  2. ユーザーにシステムプロパティをコマンドライン引数として渡してもらい、それを親プロセスと子プロセスの両方のシステムプロパティにロードします。
  3. タフと言って、ファイルを使用してください。(ひどいことではありませんが、ユーザーとしてのそのソリューションに悩まされるでしょう)
于 2011-05-12T03:40:06.363 に答える
1

これには良い答えはないと思います。しかし、幸いなことに、標準のシステムプロパティのほとんどはオーバーライドできないか、正しい心の誰もオーバーライドしません。

したがって、次のアプローチがおそらく最善の策です。

  • 渡すのが理にかなっていると思われる標準プロパティのサブセットを渡します。
  • 子JVMに使用するJVMオプション(-Dオプションを含む)を指定する方法を提供する、または
  • 上記のアプローチの組み合わせ。
于 2011-05-12T03:35:57.563 に答える
1

選択したソリューション:

それでも、比較するすべてのシステムプロパティを親に渡すだけの子プロセスを使用する必要がありました。私が偶然見つけた唯一の小さな問題は、line.separatorプロパティでした。これにより、行の読み取りコードが余分な空の行でつまずきました。それは簡単に修正できました。

答えを受け入れなかった理由:

以下の回答で提案されているアプローチは合理的ですが、どれも完全に満足できるものではありません。

私は、Javaシステムのプロパティをプロパティファイルまたは特別なコマンドライン引数を介して渡す必要があることをユーザーに伝える力があまりありません。これは厄介であり、運用慣行に反します(特別な場合は常に悪いです)。

また、子プロセスに渡すシステムプロパティのサブセットを選択することもできません。システムクラスのドキュメントでは、どのドキュメントを上書きしてもよいかはわかりません(常識では、ドキュメントが置き換えられません)。エンドユーザーが独自のプロパティを定義する機能もありますが、名前や番号でどちらも予測できません。

于 2011-05-23T03:29:32.113 に答える