◀返回
在原生可执行文件中包含资源
默认情况下,native-image
工具不会将任何 Java 资源文件集成到原生可执行文件中。您必须指定运行时应用程序可访问的资源。
本指南演示了如何通过提供资源配置文件将资源注册到原生可执行文件中。有关包含资源的更多方法,请参阅 在原生图像中访问资源。
先决条件
确保您已安装 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/ 子目录中。使用 通配符模式 注册资源
{ "resources": [ { "glob": "fortunes.u8" } ] }
native-image
工具会自动拾取它在 META-INF/native-image/ 目录中找到的所有配置文件。 - 编译应用程序
javac Fortune.java
- 构建原生可执行文件
native-image Fortune
- 运行算命应用程序进行测试
./fortune
要查看哪些资源已包含在您的原生可执行文件中,请在构建时向 native-image
工具传递选项 --emit build-report
。它将生成一个 HTML 文件,可以使用常规的 Web 浏览器对其进行检查。有关所有包含资源的信息将位于 Resources
选项卡下。
在本演示中,资源文件的路径非常简单,但在现实世界用例中可能更复杂。资源通过通配符指定。对于更高级的用例,您可以使用 API 方法注册资源(请参阅 类 RuntimeResourceAccess)。从 在原生图像中访问资源 了解有关使用通配符指定资源路径以及需要遵守的一些语法规则的更多信息。