◀返回
在原生可執行檔中使用系統屬性
假設您已使用 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