1. 序章

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

java.lang.Systemクラスはfinalクラスです。つまり、サブクラス化できないため、すべてのメソッドはstaticです。

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

これらのメソッドは、getPropertyおよびgetenvです。

2. System.getProperty()を使用する

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

システムプロパティには、現在のユーザー、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()を使用する

環境変数は、プロパティのようなキーと値のペアです。多くのオペレーティングシステムは、環境変数を使用して、構成情報をアプリケーションに渡すことができます。

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

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

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

System.getenv().forEach((k, v) -> {
    System.out.println(k + ":" + v);
});

getenv()は読み取り専用のマップを返します。マップに値を追加しようとすると、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. 環境変数がオペレーティングシステムの変数の不変のコピーである間、実行時にプロパティを更新できます。
  2. プロパティはJavaプラットフォーム内にのみ含まれますが、環境変数はオペレーティングシステムレベルでグローバルであり、同じマシンで実行されているすべてのアプリケーションで使用できます。
  3. アプリケーションをパッケージ化するときにプロパティが存在する必要がありますが、オペレーティングシステム上でほぼすべての時点で環境変数を作成できます。

5. 結論

概念的には似ていますが、プロパティと環境変数の両方のアプリケーションはまったく異なります。

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

getProperty はキャメルケースの規則に従いますが、getenvは従わないことに常に注意してください。