返回

在原生可執行檔中使用系統屬性

假設您已使用 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!。如需其他安裝選項,請造訪下載區

  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
    

與我們聯繫