java - GraalVM native-image如何从Jar中读取资源文件

标签 java graalvm graalvm-native-image substratevm

我有一个 jar 文件,其中包含一些文本文件,我尝试将文件加载为:

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);

它不起作用,因为错误显示:

[SUB] java.lang.NullPointerException
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB]  at java.io.Reader.<init>(Reader.java:167)
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB]  at hellofx.HelloFX.readFileAsStringFromJar(HelloFX.java:116)
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB]  at hellofx.HelloFX.test(HelloFX.java:107)

如果我尝试将资源文件提取到类路径src/main/resources中,那么它工作正常。

我的问题是,我们可以从 Jar 中读取资源文件(在 GraalVM native-image 中运行时)吗?有很多第三方 Java 库正在读取捆绑在同一个 Jar 中的资源文件,我们如何克服这个问题?

PS更新:

这确实是我的错误,与class.getResource()class.getClassLoader().getResource()混淆了。一个要求开头有斜线,另一个则不允许。一旦我删除了 path 变量中的斜杠,它就工作正常了。

最佳答案

您需要通过 -H:IncludeResources=path 告诉 native 镜像要包含哪些资源。该值可以是正则表达式。

有关更多详细信息,请参阅文档:https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/Resources.md

关于java - GraalVM native-image如何从Jar中读取资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63609134/

相关文章:

java - JComboBox - 缩短按键监听器

java - 如何在Java中对不同数字的字符串进行正确排序?

java - : Object[]{value1, value2} 的构造是什么?

java - Quarkus 和 DynamoDBMapper - native 构建上的 "no mapping for HASH key"

spring-boot - springboot fat jar 的 graalvm native 镜像在运行时抛出 NoSuchMethodException xxx.<init>()

java - 如何将 spring 应用程序上下文导入另一个应用程序上下文?

graalvm - 从宿主语言注入(inject)成员以到达客体语言作为客体语言类型

java - 使用 GraalVM JDK 构建/运行您的应用程序

java - GraalVM 不适用于数据库连接

quarkus - 图像堆中不允许...的实例,因为此类应在图像运行时初始化