ネイティブ・イメージでのシステム・プロパティの使用
次のJavaプログラムがあるものと仮定します:
public class App {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
たとえば、native-image -Dfoo=bar App
を指定してコンパイルすると、システム・プロパティfoo
がイメージのビルド時に使用可能になります。たとえば、アプリケーションの一部であるものの、イメージのビルド時に実行されるコード(通常は静的フィールドの初期化および静的イニシャライザ)を使用している場合です。したがって、前述のイメージを実行すると、プロパティのリストにfoo
が含まれません。
一方、app -Dfoo=bar
を使用してイメージを実行すると、プロパティのリストにfoo
が表示されます。これは、イメージの実行時に指定したためです。
つまり、次のようになります:
-D<key>=<value>
をnative-image
に渡すと、イメージのビルド時に表示されるプロパティに影響します。-D<key>=<value>
をイメージ実行に渡すと、イメージの実行時に表示されるプロパティに影響します。
実行時の環境変数へのアクセス
ネイティブ・イメージは、実行時に環境変数にアクセスすることもできます。次に例を示します。
- このJavaコードをEnvMap.javaファイルに保存します:
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
var filter = args.length > 0 ? args[0] : "";
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
if(envName.contains(filter)) continue;
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
}
}
このコードは、環境変数を繰り返し処理し、フィルタを通過し、コマンドライン引数として渡される変数を出力します。
- ネイティブ・イメージをコンパイルしてビルドします:
javac EnvMap.java
native-image EnvMap
- 結果のネイティブ・イメージを実行し、引数を渡します。環境変数の値が正しく出力されます。たとえば:
./envmap HELLO
HELLOWORLD=hello world
export HELLOWORLD="world"
./envmap HELLO
HELLOWORLD=world