ネイティブ実行可能ファイルでのシステム・プロパティの使用
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
が表示されます。
つまり、次のようになります:
-D<key>=<value>
を引数としてnative-image
に渡し、実行可能ファイルのビルド時に表示されるプロパティを制御します。-D<key>=<value>
を引数としてネイティブ実行可能ファイルに渡し、実行可能ファイルの実行時に表示されるプロパティを制御します。
ビルド時のシステム・プロパティの読取り
次の例に示すように、システム・プロパティをビルド時に読み取り、結果の実行可能ファイルに組み込むことができます。
-
GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。
-
次の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(); } }
- システム・プロパティをコマンドライン引数として渡して、ネイティブ実行可能ファイルをビルドします。次に、コマンドラインで別のシステム・プロパティを渡して、ネイティブ実行可能ファイルを実行します。
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
これは、クラスの静的イニシャライザが、ビルド時ではなく実行時に実行されたことを示します。
-
クラスの静的イニシャライザをビルド時に強制的に実行するには、次のように
--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