◀戻る
ネイティブ実行可能ファイルでシステムプロパティを使用する
次の 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! を使用することです。その他のインストールオプションについては、ダウンロードセクションを参照してください。
- 次の 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