
在 quarkus 自定义扩展中,可通过 `@ifbuildproperty` 注解配合正确的 cdi bean 发现机制实现构建时条件化注册 bean;若 bean 未被识别为可选 cdi 组件,注解将失效——关键在于确保运行时模块包含 `meta-inf/beans.xml`(即使为空)以启用 bean 发现。
Quarkus 的 @IfBuildProperty(如 @IfBuildProperty(name = "myProperty", stringValue = "true"))仅对被 Quarkus 自动发现的 CDI Bean 生效。当你在扩展的运行时模块(runtime)中定义了带该注解的类,但未启用 CDI Bean 发现机制时,Quarkus 构建流程会完全忽略这些类——导致注解不生效,且后续通过 AdditionalBeanBuildItem 手动注册的 Bean 也无法被条件过滤。
✅ 正确做法:在扩展的 runtime 模块的 src/main/resources/META-INF/ 目录下添加一个空的 beans.xml 文件:
? bean-discovery-mode="all" 是推荐值(Quarkus 2.0+ 默认行为),确保所有带有 CDI 相关注解(包括 @IfBuildProperty)的类均被扫描。即使内容为空(仅声明 schema),也能激活 Bean 发现。
⚠️ 注意事项:
- beans.xml 必须位于 runtime 模块(而非 deployment 模块),因为运行时类加载和 CDI 处理发生在 runtime 层;
- 不要删除 beans.xml 后尝试用 @Alternative 或 @Specializes 替代——它们无法替代构建时条件逻辑;
- 若你仍需在 Processor 中显式添加 AdditionalBeanBuildItem,请避免重复注册已被 @IfBuildProperty 控制的类;优先依赖自动发现 + 注解机制,更符合 Quarkus 哲学;
- 验证方式:构建时添加 -Dquarkus.log.category."io.quarkus.arc".level=DEBUG,观察日志中是否出现 Skipping bean due to @IfBuildProperty 提示。
✅ 总结:@IfBuildProperty 不是“魔法开关”,它依赖于 Quarkus 的 CDI Bean 发现管道。添加 META-INF/beans.xml 是启用该管道的最小必要操作——轻量、标准、可靠。










