◀返回
在原生可执行文件中包含资源
默认情况下,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 文件,可以使用常规网页浏览器进行查看。所有包含资源的信息将在资源选项卡下。
在此演示中,资源文件的路径很简单,但在实际用例中可能会更复杂。资源或资源包可能来自模块。了解更多如何在 Java 模块中指定资源。
对于更高级的用例,您可以使用 API 方法注册资源(请参阅 RuntimeResourceAccess 类)。要了解更多关于使用 glob 指定资源路径以及需要遵守的语法规则,请参阅在原生映像中访问资源。