You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展已生成WebJarBuildItem中的WebJarResourcesFilter并解决覆盖问题?

解决Quarkus中WebJarBuildItem覆盖冲突导致render.js无法正确替换的问题

问题背景

我在使用Quarkus SmallRye GraphQL扩展时,需要替换WebJar中render.js的部分代码。参考SmallRyeGraphQLProcessor的实现,我开发了自定义Quarkus扩展,通过构建步骤生成带有WebJarResourcesFilter的WebJarBuildItem,但构建过程中WebJarProcessor用HashMap存储覆盖映射,同一工件的多个WebJarBuildItem会无顺序覆盖,导致只有一个替换生效。目前我通过请求过滤器将修改后的render.js存入内存并返回内容,但想找更优方案。


方案1:合并WebJarResourcesFilter到单个WebJarBuildItem

  • 避免生成多个针对同一工件的WebJarBuildItem,而是在自定义扩展的构建步骤中,先获取已存在的同工件WebJarBuildItem,将自定义过滤器合并到其过滤器列表中,再输出单个WebJarBuildItem。
  • 核心逻辑:通过构建步骤的ExistingBuildItem获取已有WebJar配置,合并过滤器后重新生成。
  • 示例代码片段:
@BuildStep
void mergeWebJarFilters(
        @ExistingBuildItem WebJarBuildItem existingWebJar,
        BuildProducer<WebJarBuildItem> webJarProducer) {
    // 定位目标WebJar工件
    if ("io.smallrye:smallrye-graphql-ui".equals(existingWebJar.getArtifact())) {
        List<WebJarResourcesFilter> mergedFilters = new ArrayList<>(existingWebJar.getFilters());
        // 添加自定义render.js替换逻辑
        mergedFilters.add((path, inputStream) -> {
            if ("render.js".equals(path)) {
                // 返回修改后的render.js内容输入流
                String modifiedContent = "// 你的修改后的render.js代码";
                return new ByteArrayInputStream(modifiedContent.getBytes(StandardCharsets.UTF_8));
            }
            return inputStream;
        });
        // 生成合并后的WebJarBuildItem
        webJarProducer.produce(new WebJarBuildItem(existingWebJar.getArtifact(), mergedFilters));
    }
}

方案2:利用Quarkus资源优先级直接替换文件

  • 无需编写扩展,直接将修改后的render.js放置在项目本地资源目录,路径与WebJar中的文件完全匹配:src/main/resources/META-INF/resources/webjars/smallrye-graphql-ui/[对应版本号]/render.js。
  • Quarkus会优先加载项目本地的资源,自动覆盖WebJar中的同名文件。
  • 注意:路径中的版本号必须与依赖的SmallRye GraphQL UI WebJar版本一致,版本更新时需同步调整路径。

方案3:实现WebJarProcessorCustomizer扩展点

  • 自定义WebJarProcessorCustomizer接口实现类,在WebJar处理流程中直接插入文件修改逻辑,跳过WebJarBuildItem的冲突问题。
  • 示例代码:
public class RenderJsWebJarCustomizer implements WebJarProcessorCustomizer {
    @Override
    public void customize(WebJarProcessor processor) {
        processor.addFilter((artifact, path, inputStream) -> {
            if ("io.smallrye:smallrye-graphql-ui".equals(artifact) && "render.js".equals(path)) {
                // 读取原内容并修改,或直接返回预定义的修改后内容
                String modifiedContent = "// 自定义render.js代码";
                return new ByteArrayInputStream(modifiedContent.getBytes(StandardCharsets.UTF_8));
            }
            return inputStream;
        });
    }
}
  • 在扩展的quarkus-extension.properties中注册该自定义器:
quarkus.webjar-processor.customizer=com.your.package.RenderJsWebJarCustomizer

内容的提问来源于stack exchange,提问作者Patrycja Rewerska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:12:04