戻る

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

次の Java アプリケーションを javac でコンパイルしたとします。

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 が表示されます。

言い換えると

  • ビルド時に表示するプロパティを制御するには、native-image-D<key>=<value> を引数として渡します。
  • 実行時に表示するプロパティを制御するには、ネイティブ実行可能ファイルに -D<key>=<value> を引数として渡します。

ビルド時にシステムプロパティを読み取る

ビルド時にシステムプロパティを読み取り、次の例に示すように結果の実行可能ファイルファイルに追加できます。

前提条件

GraalVM JDK がインストールされていることを確認します。最も簡単な方法は SDKMAN! を使用することです。その他のインストールオプションについては、ダウンロードセクションを参照してください。

  1. 次の 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();
         } 
     }
    
  2. ネイティブ実行可能ファイルを作成し、システムプロパティをコマンドライン引数として渡します。次に、ネイティブ実行可能ファイルを実行し、異なるシステムプロパティをコマンドラインで渡します。
     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
    

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

  3. クラスの静的イニシャライザをビルド時に強制的に実行するには、次のように --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
     ...
    
  4. 次のとおり、実行可能ファイルを再度実行します。
    ./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
    

私たちとつながる