◀返回
在原生可執行檔中包含資源
預設情況下,native-image
工具不會將任何 Java 資源檔整合到原生可執行檔中。您必須指定您的應用程式在執行時應該可以存取的資源。
本指南示範如何透過提供資源設定檔來註冊要包含在原生可執行檔中的資源。有關包含資源的更多方法,請參閱在 Native Image 中存取資源。
先決條件
請確保您已安裝 GraalVM JDK。最簡單的入門方法是使用SDKMAN!。對於其他安裝選項,請造訪下載區。
執行範例
在以下範例中,您將執行一個「算命師」應用程式,它模擬傳統的 fortune
Unix 程式 (如需更多資訊,請參閱 fortune)。
- 將以下 Java 原始碼另存為名為 Fortune.java 的檔案
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class Fortune { private static final String SEPARATOR = "%"; private static final Random RANDOM = new Random(); private ArrayList<String> fortunes = new ArrayList<>(); public Fortune(String path) { // Scan the file into the array of fortunes Scanner s = new Scanner(new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(path)))); s.useDelimiter(SEPARATOR); while (s.hasNext()) { fortunes.add(s.next()); } } private void printRandomFortune() throws InterruptedException { int r = RANDOM.nextInt(fortunes.size()); //Pick a random number String f = fortunes.get(r); //Use the random number to pick a random fortune for (char c: f.toCharArray()) { // Print out the fortune System.out.print(c); Thread.sleep(100); } } public static void main(String[] args) throws InterruptedException { Fortune fortune = new Fortune("/fortunes.u8"); fortune.printRandomFortune(); } }
-
下載 fortunes.u8 資源檔,並將其儲存在與 Fortune.java 相同的目錄中。
- 建立名為 reachability-metadata.json 的設定檔,並將其儲存在 META-INF/native-image/ 子目錄中。使用 glob 模式 註冊資源
{ "resources": [ { "glob": "fortunes.u8" } ] }
native-image
工具會自動選取其在 META-INF/native-image/ 目錄中找到的所有設定檔。 - 編譯應用程式
javac Fortune.java
- 建置原生可執行檔
native-image Fortune
- 執行算命師應用程式以進行測試
./fortune
若要查看哪些資源包含在您的原生可執行檔中,請在建置時將選項 --emit build-report
傳遞給 native-image
工具。它會產生一個 HTML 檔案,可以使用一般的網頁瀏覽器檢查。有關所有包含的資源的資訊將位於 Resources
標籤下。
在本範例中,資源檔的路徑很簡單,但在真實世界的用例中可能會更複雜。資源是透過 glob 指定的。對於更進階的用例,您可以使用 API 方法註冊資源(請參閱 RuntimeResourceAccess 類別)。從在 Native Image 中存取資源中,了解有關使用 glob 指定資源路徑以及需要遵守的一些語法規則的更多資訊。