Java System.getPropertyとSystem.getenv

1.はじめに

Javaアプリケーションでは、 java.lang パッケージが自動的にインポートされます。このパッケージには、 NullPointerException から Object 、 Math 、および String までの、よく使用されるクラスが多数含まれています。

java.lang.System クラスは final クラスです。つまり、そのインスタンスを作成することはできません。したがって、すべてのメソッドは static です。

システムプロパティと環境変数を読み取るための2つの System メソッドの違いを調べます。

これらのメソッドは getProperty と getenv です。

2. System.getProperty()を使う

Javaプラットフォームは Properties オブジェクトを使用して ローカルシステムと設定 に関する情報を提供します そしてそれを System Properties ** と呼びます。

システムプロパティには、現在のユーザー、現在のバージョンのJavaランタイム、ファイルパス名の区切り記号などの情報が含まれます。

以下のコードでは、 System.getProperty(“ log dir”) を使用して、プロパティ log dir の値を読み取ります。このプロパティが存在しない場合、 getProperty は __/ tmp /log__を返します。

String log__dir = System.getProperty("log__dir","/tmp/log");

実行時にシステムのプロパティを更新するには、メソッド System.setProperty を使用します。

System.setProperty("log__dir", "/tmp/log");

propertyName コマンドライン引数を使用して、独自のプロパティまたは設定値をアプリケーションに渡すことができます。

java -jar jarName -DpropertyName=value

app.jarでfooのプロパティをbarの値で設定します。

java -jar app -Dfoo =” bar”

  • System.getProperty は常に String を返します。

3. System.getenv()を使う

  • 環境変数は__Propertiesのようなキーと値のペアです。 多くのオペレーティングシステムは環境情報を使って設定情報をアプリケーションに渡すことができます。

環境変数を設定する方法は、オペレーティングシステムによって異なります。たとえば、Windowsでは、コントロールパネルからシステムユーティリティアプリケーションを使用し、Unixではシェルスクリプトを使用します。

  • プロセスを作成するとき、デフォルトでそれはその親プロセスのクローン環境を継承します。

次のコードスニペットは、すべての環境変数を表示するためのラムダ式の使用方法を示しています。

System.getenv().forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
  • getenv() は読み取り専用の Mapを返します。 ** マップに値を追加しようとすると UnsupportedOperationException がスローされます。

単一の変数を取得するには、変数名を付けて getenv を呼び出します。

String log__dir = System.getenv("log__dir");

一方、アプリケーションから別のプロセスを作成し、その環境に新しい変数を追加することもできます。

Javaで新しいプロセスを作成するには、 environment というメソッドを持つ ProcessBuilder クラスを使用します。このメソッドは Map を返しますが、今度はマップは読み取り専用ではないため、要素を追加できます。

ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
env.put("log__dir", "/tmp/log");
Process process = pb.start();

4.違い

どちらも基本的には String キーの String 値を提供するマップですが、いくつかの違いを見てみましょう。

  1. 実行時にプロパティを更新することができますが、環境変数は

オペレーティングシステムの変数の不変のコピー

  1. EnvironmentはJavaプラットフォーム内にのみ含まれます

変数はオペレーティングシステムレベルでグローバルであり、同じマシン上で実行されているすべてのアプリケーションで利用可能です。

  1. アプリケーションをパッケージ化するときにプロパティが存在しなければならない

オペレーティングシステム上のほとんどすべての時点における環境変数。

5.まとめ

概念的には似ていますが、プロパティと環境変数の両方の適用はかなり異なります。

オプション間の選択は、しばしば範囲の問題です。環境変数を使用すると、同じアプリケーションを複数のマシンにデプロイして異なるインスタンスを実行でき、オペレーティングシステムレベルで、またはAWSやAzureのコンソールでも構成できます。 configを更新するためにアプリケーションを再構築する必要がなくなりました。

getProperty はキャメルケースの慣例に従い、 getenv はそうではないことを常に覚えておいてください。