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

はそうではないことを常に覚えておいてください。