关于编写扩展的常见问题
应该编写扩展吗?
我为什么要编写扩展?
请参阅扩展哲学。扩展成熟度矩阵显示了扩展可以提供的各种功能。扩展可以做的另一件有用的事情是捆绑其他扩展。请查看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.io、http://extensions.quarkus.io 和命令行工具中。 http://extensions.quarkus.io 上的网页会延迟刷新几次,因此新扩展可能会延迟显示在那里。要调试丢失的扩展,请首先
-
检查您的扩展是否存在于 Maven Central 中
-
检查扩展是否包含在扩展目录列表中(只需要包含一次,未来的版本将自动检测到)
-
检查扩展是否列在Quarkus 注册表的所有已知扩展列表中
-
检查自更新目录以来是否已对扩展站点进行了绿色的构建