ネイティブ実行可能ファイルでのシステム・プロパティの使用

javacを使用して次の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. GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  2. 次のJavaコードをReadProperties.javaという名前のファイルに保存し、javacを使用してコンパイルします:

     public class ReadProperties {
         private static final String STATIC_PROPERTY_KEY = "static_key";
         private static final String INSTANCE_PROPERTY_KEY = "instance_key";
         private static final String STATIC_PROPERTY;
         private final String instanceProperty;
         static {
             System.out.println("Getting value of static property with key: " + STATIC_PROPERTY_KEY);
             STATIC_PROPERTY = System.getProperty(STATIC_PROPERTY_KEY);
         }
        
         public ReadProperties() {
             System.out.println("Getting value of instance property with key: " + INSTANCE_PROPERTY_KEY);
             instanceProperty = System.getProperty(INSTANCE_PROPERTY_KEY);
         }
            
         public void print() {
             System.out.println("Value of instance property: " + instanceProperty);
         } 
            
         public static void main(String[] args) {
             System.out.println("Value of static property: " + STATIC_PROPERTY);
             ReadProperties rp = new ReadProperties();
             rp.print();
         } 
     }
    
  3. システム・プロパティをコマンドライン引数として渡して、ネイティブ実行可能ファイルをビルドします。次に、コマンドラインで別のシステム・プロパティを渡して、ネイティブ実行可能ファイルを実行します。
     native-image -Dstatic_key=STATIC_VALUE ReadProperties
    
     ./readproperties -Dinstance_key=INSTANCE_VALUE
    

    次の出力が表示されるはずです。

     Getting value of static property with key: static_key
     Value of static property: null
     Getting value of instance property with key: instance_key
     Value of instance property: INSTANCE_VALUE
    

    これは、クラスの静的イニシャライザが、ビルド時ではなく実行時に実行されたことを示します。

  4. クラスの静的イニシャライザをビルド時に強制的に実行するには、次のように--initialize-at-build-timeフラグを使用します:

     native-image --initialize-at-build-time=ReadProperties -Dstatic_key=STATIC_VALUE ReadProperties
    

    native-imageツールの出力には、次のような出力が表示されます:

     ...
     [1/7] Initializing...                                            (7.7s @ 0.07GB)
     Getting value of static property with key: static_key
     ...
    

    次のように、実行可能ファイルを再度実行します:

     ./readproperties -Dinstance_key=INSTANCE_VALUE
    

    今回は、次の出力が表示されます。静的イニシャライザが実行時ではなくビルド時に実行されたことを確認します。

     Value of static property: STATIC_VALUE
     Getting value for instance property key: instance_key
     Value of instance property: INSTANCE_VALUE