ネイティブ実行可能ファイルにリソースを含める

デフォルトでは、native-imageツールは、どのリソース・ファイルもネイティブ実行可能ファイルに統合しません。実行時にアプリケーションからアクセスできるリソースを指定する必要があります。

このガイドでは、リソース構成ファイルを指定して、ネイティブ実行可能ファイルに含めるリソースを登録する方法を示します。リソースを含めるその他の方法は、ネイティブ・イメージでのリソースへのアクセスに関する項を参照してください。

前提条件

GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

デモの実行

次の例では、従来のfortune UNIXプログラムをシミュレートする"fortune teller"アプリケーションを実行します(詳細は、fortuneを参照してください)。

  1. 次の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();
         }
     }
    
  2. fortunes.u8リソース・ファイルをダウンロードし、Fortune.javaと同じディレクトリに保存します。

  3. reachability-metadata.jsonという名前の構成ファイルを作成し、それをMETA-INF/native-image/サブディレクトリに保存します。globパターンを使用してリソースを登録します:
     {
       "resources": [
         {
           "glob": "fortunes.u8"
         }
       ]
     }
    

    native-imageツールは、META-INF/native-image/ディレクトリで見つかったすべての構成ファイルを自動的に選択します。

  4. アプリケーションをコンパイルします:
     javac Fortune.java
    
  5. ネイティブ実行可能ファイルをビルドします:
     native-image Fortune
    
  6. fortune tellerアプリケーションを実行してテストします:
     ./fortune
    

ネイティブ実行可能ファイルに含まれたリソースを確認するには、ビルド時にnative-imageツールにオプション--emit build-reportを渡します。通常のWebブラウザで調査できるHTMLファイルが生成されます。含まれるすべてのリソースに関する情報は、「リソース」タブの下にあります。

このデモでは、リソース・ファイルへのパスは単純ですが、実際のユース・ケースではより複雑になる場合があります。リソースまたはリソース・バンドルはモジュールから取得できます。その指定方法の詳細は、「Javaモジュールのリソース」を参照してください。

より高度なユース・ケースでは、APIメソッドを使用してリソースを登録できます(クラスRuntimeResourceAccessを参照)。globを使用したリソース・パスの指定と、従う必要のあるいくつかの構文ルールの詳細は、ネイティブ・イメージでのリソースへのアクセスに関する項を参照してください。