◀戻る
ネイティブ実行可能ファイルにリソースを含める
デフォルトでは、native-image
ツールはJavaリソースファイルをネイティブ実行可能ファイルに組み込みません。アプリケーションが実行時にアクセスできるようにするリソースを指定する必要があります。
このガイドでは、リソース構成ファイルを提供することで、ネイティブ実行可能ファイルに含めるリソースを登録する方法を説明します。リソースを含める他の方法については、「ネイティブイメージでのリソースへのアクセス」を参照してください。
前提条件
GraalVM JDKがインストールされていることを確認してください。始める最も簡単な方法はSDKMAN!です。他のインストールオプションについては、ダウンロードセクションをご覧ください。
デモを実行する
次の例では、従来のfortune
UNIXプログラムをシミュレートする「占い」アプリケーションを実行します(詳細については、フォーチュンを参照してください)。
- 次の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/サブディレクトリに保存します。グロブパターンを使用してリソースを登録します。
{ "resources": [ { "glob": "fortunes.u8" } ] }
native-image
ツールは、META-INF/native-image/ディレクトリに見つかったすべての構成ファイルを自動的に取得します。 - アプリケーションをコンパイルします。
javac Fortune.java
- ネイティブ実行可能ファイルをビルドします。
native-image Fortune
- フォーチュンテラーアプリケーションを実行してテストします。
./fortune
ネイティブ実行可能ファイルにどのリソースが含まれているかを確認するには、ビルド時にオプション--emit build-report
をnative-image
ツールに渡します。通常のWebブラウザで閲覧できるHTMLファイルが生成されます。すべての含まれているリソースに関する情報は、リソース
タブにあります。
このデモではリソースファイルへのパスは簡単ですが、現実の使用例ではより複雑な場合があります。リソースはグロブで指定されます。より高度なユースケースでは、APIメソッドを使用してリソースを登録できます(クラスRuntimeResourceAccessを参照してください)。グロブを使用してリソースパスを指定する方法と留意すべき構文規則の詳細については、「ネイティブイメージでのリソースへのアクセス」を参照してください。