从GraalVM到Quarkus系列
A000篇-忽悠你用GraalVM
A001篇-NativeImage相关的注解
B001篇-NativeImage相关的注解@TargetClass
A002篇-GraalVM中的动态代理
A003篇-NativeImage中的资源
从GraalVM到Quarkus系列-A003篇-NativeImage中的资源
前言
很多时候我们需要在程序中嵌入一些资源文件,在JVM模式下这很简单,但是在NativeImage模式下怎么办?
一、为什么要嵌入资源文件?
- 本地化 国际化文件
- 配置文件,云原生一般只有默认配置会放在配置文件,其他的动态配置一般在配置中心,所以直接把配置文件嵌入NativeImage也是常见做法
- SPI配置文件
- …
二、NativeImage是怎么处理嵌入资源的
1.新建一个和前面几篇一样的项目
resources目录下嵌入你喜欢的资源…:

2.读取文件信息

- 我这是在JVM模式下运行的
- 可以看到是就是我们平时获取资源用的方式,完全没有什么特别的
- 但是在NativeImage模式下同样的代码是否也能运行呢?

用NativeImage模式运行一下,怎么用在前面几篇有讲过

- 可以看到我们读取资源是失败的,所以在后面报了个空指针
- 那么在NativeImage模式下和JVM模式下有什么不同呢?
- 我们去扒一下源码
- 我找到了这个:


- 可以看到GraalVM中对NativeImage模式下的
ClassLoader做了修改,怎么修改的见前几篇内容 - 这几个方法都调用了一个静态方法
Resources.get(资源名) - 那这里面有什么骚操作呢?


- 红色箭头是我们刚才看到的获取资源的方法
- 那黄色的箭头指向的肯定就是注册资源的地方了
- 另外Quarkus源码中也有类似的写法:

- 源代码是动态生成的类
- 注释中我转译了部分代码
- 可以看到在Quarkus中实际注册资源文件就是用的
Resources.registerResource方法 - 那么在哪里写呢?

- 还是得祭出
Feature.beforeAnalysis,Feature相关内容看前几篇 - 在这里我们注册需要用到的资源文件
- NativeImage模式编译看下结果

- 可以看到在NativeImage模式下资源也被读取成功了
- 说明我们刚才注册的资源是生效的
- 这个注册操作只针对NativeImage模式,是不会影响JVM模式的
总结
- 主要内容就是这些
- 代码在这
- 好困,骚不动了,先这样吧…


本文探讨了在GraalVM NativeImage模式下如何处理嵌入资源文件的问题,包括为何需要嵌入资源文件及NativeImage如何实现资源的读取。
1607

被折叠的 条评论
为什么被折叠?



