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
値を提供するマップですが、いくつかの違いを見てみましょう。
-
実行時にプロパティを更新することができますが、環境変数は
オペレーティングシステムの変数の不変のコピー
-
EnvironmentはJavaプラットフォーム内にのみ含まれます
変数はオペレーティングシステムレベルでグローバルであり、同じマシン上で実行されているすべてのアプリケーションで利用可能です。
-
アプリケーションをパッケージ化するときにプロパティが存在しなければならない
オペレーティングシステム上のほとんどすべての時点における環境変数。
5.まとめ
概念的には似ていますが、プロパティと環境変数の両方の適用はかなり異なります。
オプション間の選択は、しばしば範囲の問題です。環境変数を使用すると、同じアプリケーションを複数のマシンにデプロイして異なるインスタンスを実行でき、オペレーティングシステムレベルで、またはAWSやAzureのコンソールでも構成できます。 configを更新するためにアプリケーションを再構築する必要がなくなりました。
getProperty
はキャメルケースの慣例に従い、
getenv
はそうではないことを常に覚えておいてください。