从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模式的
总结
- 主要内容就是这些
- 代码在这
- 好困,骚不动了,先这样吧…