51

Java アプリケーションから実行時に環境変数を設定することは可能ですか? Java 1.5 java.lang.System クラスには getenv() メソッドがあり、必要なのは setenv() メソッドだけです...

Javaプロセス自体で環境変数を変更することは可能ですか? 子プロセスではありません。

JNIを介してそれを達成することは可能ですか? そして、それはどのように機能しますか?

ありがとう。

編集:わかりました、このように言いましょう-Javaで次のことができますか。お答えください。

  1. 現在のプロセスの環境を変更できますか?
  2. 親プロセスの環境を変更できますか?
  3. 子プロセスの環境を変更できますか?

Hemal Pandya は、「現在のプロセスと子プロセスの環境は変更できますが、このプロセスを生成した親プロセスの環境は変更できません」と回答しています。これに同意しますか?

4

6 に答える 6

38

私の直感が正しく、生成された (フォークされた) サブプロセス ( ) のために実際に環境を変更したい場合は、 の代わりにProcessBuilderRuntime.getRuntime().exec()を使用してください。インスタンスのenvironment()メソッドを使用して、カスタム環境を構築できます。exec()ProcessBuilder

これが達成しようとしているものでない場合は、この回答を無視してください。


アップデート

更新された具体的な 3 つの質問に対する回答は次のとおりです。

  1. 現在のプロセスの環境を変更できますか?
    • 簡単ではありません。プロセスの環境を変更するかSystem.getenv()、同じ JVM で返される値を変更するか、またはその両方を行うかによって異なります。
    • Greg Hewgill が指摘したように、現在のプロセスの環境を変更するには、setenvJNI を介して呼び出すか、プラットフォーム固有の同等物を呼び出すことができます。また、以下のポイント 2の非常に複雑な方法を使用することもできます。これは、どのプロセスでも機能します (アクセス許可がある場合)。ただし、ほとんどの JVMSystem.getenv()では、環境が多くの場合、仮想マシンの起動時にjava.util.Map(または同等のもの) にキャッシュされます。
    • JVM のキャッシュされた環境のコピーを変更するには、キャッシュが使用されている場合 (System.javaデプロイに使用する JVM ディストリビューションのソース コードを参照)、(クラスのロード順、リフレクション、またはインスツルメンテーションを使用して) 実装をハッキングしてみてください。 ) たとえば、SUN の v1.6 JVM の場合、環境キャッシュは文書化されていないProcessEnvironmentクラス (パッチを適用できます)によって管理されます。
  2. 親プロセスの環境を変更できますか?
  3. 子プロセスの環境を変更できますか?
    • はいProcessBuilderプロセスを生成するときまで。
    • 環境の変更が必要なときにプロセスがすでに生成されている場合は、上記の方法 2 (または、生成時のコードインジェクションなどの同様に複雑な方法で、親プロセスによるソケットなどを介して後で制御される) が必要です。

を含むものを除いて、上記のすべてのメソッドProcessBuilderは脆弱で、エラーが発生しやすく、さまざまな程度で移植性がなく、マルチスレッド環境で競合状態になりやすいことに注意してください。

于 2009-02-24T01:10:49.183 に答える
7

更新された質問への回答:

  1. 現在のプロセスの環境を変更できますか?
    はい、JNIを使​​用して呼び出すsetenv()場合など。ただし、おそらくこれを行う必要はなく、すべての状況で機能するとは限りません。
  2. 親プロセスの環境を変更できますか?
    いいえ
  3. 子プロセスの環境を変更できますか?
    はい、使用してProcessBuilderいます。
于 2009-02-24T20:50:35.277 に答える
3

少なくとも純粋にJavaではそうではないと思いますが、なぜこれを行う必要があるのですか? Java ではSystem.getProperties()、変更可能な を介してプロパティを使用することをお勧めします。

どうしても必要な場合は、Csetenv関数を JNI 呼び出しでラップできると確信しています。実際、誰かがすでにそうしているとしても、私は驚かないでしょう。ただし、コードの詳細はわかりません。

于 2009-02-24T01:05:31.973 に答える
0

現在のプロセスと子プロセスの環境は変更できますが、このプロセスを生成した親プロセスの環境は変更できません。

于 2009-02-24T01:47:50.437 に答える