如何在Quarkus扩展代码中读取宿主应用的资源文件
问题根源
Quarkus采用分层类加载器架构,扩展的类加载器与宿主应用的类加载器相互隔离。你使用扩展内标注@ApplicationScoped类的类加载器读取资源时,默认只会检索扩展自身的类路径,无法访问宿主应用的资源。
解决方案
分两种场景按需选择:
场景1:运行时(应用启动onStart阶段)读取资源
替换原有的类加载器实现,改用当前线程上下文类加载器读取,上下文类加载器在运行时默认绑定宿主应用的类加载器:
// 替换原来的 getClass().getClassLoader().getResourceAsStream() 写法 InputStream resourceStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("目标资源相对路径");
如果需要确保指定路径的资源不会被Quarkus构建阶段优化过滤,可以在扩展的构建步骤中添加RuntimeResourcesBuildItem声明:
@BuildStep RuntimeResourcesBuildItem registerRuntimeResources() { // 把需要运行时访问的资源路径/路径规则添加进去 return RuntimeResourcesBuildItem.builder() .addResource("custom-config.json") .addResourcePattern("conf/*.yml") .build(); }
场景2:构建阶段(@BuildStep执行时)读取资源
直接注入ApplicationArchivesBuildItem获取宿主应用的归档资源,无需通过类加载器读取:
@BuildStep void processHostResource(ApplicationArchivesBuildItem archives) { // 获取宿主应用的根归档 ApplicationArchive hostArchive = archives.getRootArchive(); // 查找指定路径的资源 Optional<Resource> targetResource = hostArchive.getResource("目标资源相对路径"); if (targetResource.isPresent()) { try (InputStream inputStream = targetResource.get().openStream()) { // 处理资源内容的业务逻辑 } catch (IOException e) { // 自定义异常处理逻辑 } } }
内容的提问来源于stack exchange,提问作者user3239600
相关产品推荐
相关产品推荐

