ネイティブ・イメージでのシステム・プロパティの使用

次の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が表示されます。これは、イメージの実行時に指定したためです。

つまり、次のようになります:

実行時の環境変数へのアクセス

ネイティブ・イメージは、実行時に環境変数にアクセスすることもできます。次に例を示します。

  1. この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));
          }
      }
  }

このコードは、環境変数を繰り返し処理し、フィルタを通過し、コマンドライン引数として渡される変数を出力します。

  1. ネイティブ・イメージをコンパイルしてビルドします:
  javac EnvMap.java
  native-image EnvMap
  1. 結果のネイティブ・イメージを実行し、引数を渡します。環境変数の値が正しく出力されます。たとえば:
  ./envmap HELLO
  HELLOWORLD=hello world
  export HELLOWORLD="world"
  ./envmap HELLO
  HELLOWORLD=world