我开始玩quarkus和graalvm。我添加文件(txt和jpg)到项目(src/main/resources/
)中的资源。为了确保我可以在控制器中访问这个文件,我显示了它的大小:
URL url = Thread.currentThread().getContextClassLoader().getResource("/Resource2.txt");
File file = new File(url.toURI());
return "Hello My Friend! File size in bytes = " + file.length();
当我用Maven(mvn quarkus:dev
)运行它时,它可以工作。控制器代码是here。
当我创建原生Quarkus应用程序并尝试在Docker中运行时发生问题。为了确保该文件包含在原生映像中,我添加了一个大的jpg文件(3.3MB),创建了resources-config.json
:
{ "resources":
{ "includes": [
{ "pattern": "IMG_3_3M\\.jpg$"},
{ "pattern": "Resources2\\.txt$"}
]
}}
并在application.properties
中添加:quarkus.native.additional-build-args = -H:ResourceConfigurationFiles=resources-config.json
。本地流道大小从以下值增加:
39M Mar 21 12:48 hello-quarkus-1.0-SNAPSHOT-runner
- 至:
44M Mar 21 12:19 hello-quarkus-1.0-SNAPSHOT-runner
因此,我假设jpg文件包括在内,但仍然在Docker图像内运行本机应用程序时,我得到了NPE:
Caused by: java.lang.NullPointerException
at it.tostao.quickstart.GreetingResource.hello(GreetingResource.java:24)
其中第24行:是url.toURI()
。
知道如何读取本机映像中的资源吗?配置中是否缺少某些内容?
以下是重现该问题的示例映像,构建和运行本机映像所需的所有命令可在README.MD中找到:
https://github.com/sleski/hello-quarkus
到目前为止,我检查了这个网址,仍然无法在本机映像中找到资源:
· How to include classpath resources in a Quarkus native image?
· How to read classpath resources in Quarkus native image?
· https://quarkus.io/guides/writing-native-applications-tips
· Read txt file from resources folder on maven Quarkus project From Docker Container
2条答案
按热度按时间bprjcwpo1#
首先修复json
或者你可以有 *.txt作为模式.喜欢在这文档
https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/Resources.md表示使用
当我尝试我有问题.你可以看到这工作代码下面为你的项目
GreetingResource.class.getResourceAsStream(resourcePath);
实际上是把资源带到这里,我认为这个特性将来可能会改变,所以我也在代码中保留了ModuleLayer,我使用了graalvm 17-21.3.0你可以在下面找到构建日志
kqlmhetl2#
这是我如何解决问题-更改的示例在此分支中:https://github.com/sleski/hello-quarkus/tree/solution_for_native
说明:
图像位于:
src/main/resources/images
,名称为:在application.properties
中,我添加了images.location
变量:在java控制器中我添加了:
在
docker.native
中添加:COPY target/classes/images/*.jpg /work/images/
当我用
querkus:dev
启动应用程序时,它从src/main/resources/images
获取图像,当我运行narive image时:/work/images
.在这两种情况下均有效:
File size is = 3412177
.