编辑此页面

关于编写扩展的常见问题

应该编写扩展吗?

我为什么要编写扩展?

请参阅扩展哲学扩展成熟度矩阵显示了扩展可以提供的各种功能。扩展可以做的另一件有用的事情是捆绑其他扩展。请查看Quarkus MicroProfile 扩展,以获得聚合器扩展的示例。

是否存在不需要扩展的情况?

并非每个问题都需要扩展!如果您只是捆绑外部库(不是已经存在的扩展)并进行少量调整,则可能不需要扩展。例如,普通库可以创建新的配置元素并在 Jandex 中注册类(此博客展示了如何操作)。

我如何知道我可能希望在扩展中包含哪些类型的能力?

请查看扩展成熟度矩阵

字节码转换

如何更改类路径上的代码?

可以使用 BytecodeTransformerBuildItem 来操作字节码。例如,请参阅此博客,了解如何从依赖项中删除有问题的桥接方法

CDI

我正在使用 CDI,我不知道如何…​

CDI 集成指南为扩展作者提供了许多与 CDI 相关的用例的解决方案。

我已转换用户类以添加注入字段,但 CDI 不起作用

如果扩展使用 BytecodeTransformerBuildItem 转换用户类,并将 @jakarta.annotation.Resource 替换为 @jakarta.inject.Inject 会发生什么?该字段将不会被 Arc 注入。调试将显示转换后的类已加载到应用程序中,但看起来 Arc 没有看到新代码。

与 Arc 相关的转换通常应使用 AnnotationsTransformerBuildItem 完成。原因是所有 Quarkus 的字节码转换都在 Jandex 索引之后完成。这意味着更改永远不会反映回 Jandex。

大多数扩展使用 Jandex 作为查找要做什么的真实来源。这些扩展不会在字节码本身中看到新的/修改的端点。此限制的解决方案是注释转换器。您还应该意识到,虽然 Arc 和 Quarkus REST 遵循注释转换器,但并非所有扩展都这样做。

类路径中的某些内容具有 @Inject 注释,这使 CDI 感到困惑。我该如何解决?

您需要实现一个 AnnotationsTransformer 并删除有问题的注入点。(请记住,如果用例涉及 CDI,则它需要是 AnnotationsTransformer,而不是 BytecodeTransformer`。)请参阅这篇博客,了解如何使用 AnnotationsTransformer 扩展从 Airline 库中清除非 @Inject 注释,以便可以在启用 CDI 的运行时中使用它。

横切关注点

如何将应用程序日志重定向到外部服务?

LogHandlerBuildItem 是一种重定向应用程序日志的便捷方法。请参阅此工作示例,了解如何将输出定向到 AWS CloudWatch 的扩展

扩展的构建和托管基础设施

我可以使用 Gradle 构建我的扩展吗?

可以,但这不是最典型的模式。请参阅构建您的第一个扩展指南,以获取有关设置 Gradle 扩展的说明。请查看JobRunr 扩展,以获得示例实现。

如果我希望我的扩展在 code.quarkus.io 中,它是否必须在 Quarkiverse GitHub 组织中?

在目录中注册扩展与源代码所在的位置无关。quarkiverse 存储库提供了一些快捷方式,可以更轻松地发布和测试扩展,但是任何扩展都可以注册到目录

我的扩展未显示在 extensions.quarkus.io 上

扩展目录中的每个扩展都应显示在 http://code.quarkus.iohttp://extensions.quarkus.io 和命令行工具中。 http://extensions.quarkus.io 上的网页会延迟刷新几次,因此新扩展可能会延迟显示在那里。要调试丢失的扩展,请首先

  • 检查您的扩展是否存在于 Maven Central

  • 检查扩展是否包含在扩展目录列表中(只需要包含一次,未来的版本将自动检测到)

  • 检查扩展是否列在Quarkus 注册表的所有已知扩展列表中

  • 检查自更新目录以来是否已对扩展站点进行了绿色的构建

其他主题

quickstart 和 codestart 之间有什么区别?

codestart 和 quickstart 都旨在帮助用户快速开始编码。 codestart 是生成的应用程序,而 quickstart 是可浏览的源代码。 Codestart 允许创建自定义应用程序,这使其非常强大。