Quarkus扩展能否在构建时修改构建时属性?求实现方法
如何在Quarkus扩展中修改构建时属性(以OpenTelemetry传播器为例)
要实现给Quarkus应用注入环境级的默认配置(比如自动添加自定义OpenTelemetry传播器),你不需要直接修改现有属性,而是利用Quarkus提供的扩展配置机制,以下是具体方案:
1. 使用ConfigDefaultsBuildItem设置默认值
Quarkus专门提供了ConfigDefaultsBuildItem用于扩展向框架注入配置默认值,包括构建时属性。通过它可以为quarkus.otel.propagators设置包含自定义传播器的默认值:
import io.quarkus.deployment.builditem.ConfigDefaultsBuildItem; import io.quarkus.deployment.annotations.BuildStep; class YourExtensionProcessor { @BuildStep ConfigDefaultsBuildItem configureOtelPropagators() { return ConfigDefaultsBuildItem.builder() // 拼接原有默认传播器和你的自定义传播器 .setDefaults("quarkus.otel.propagators", "tracecontext,baggage,your-custom-propagator") .build(); } }
注意:如果用户在application.properties或通过系统属性手动配置了quarkus.otel.propagators,你的默认值会被自动覆盖,完全符合Quarkus的配置优先级规则。
2. 仅在OTel启用时生效
如果需要限制默认值仅在OpenTelemetry扩展被引入并启用时生效,可以通过构建条件来实现:
import io.quarkus.deployment.builditem.ConfigDefaultsBuildItem; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.opentelemetry.deployment.OpenTelemetryBuildItem; import io.quarkus.deployment.BuildCondition; import io.quarkus.deployment.BuildContext; class YourExtensionProcessor { @BuildStep(onlyIf = IsOpenTelemetryEnabled.class) ConfigDefaultsBuildItem configureOtelPropagators(OpenTelemetryBuildItem otelBuildItem) { return ConfigDefaultsBuildItem.builder() .setDefaults("quarkus.otel.propagators", "tracecontext,baggage,your-custom-propagator") .build(); } // 自定义条件判断类,检查OTel是否启用 static class IsOpenTelemetryEnabled implements BuildCondition { @Override public boolean test(BuildContext context) { return context.getBuildItem(OpenTelemetryBuildItem.class).isPresent(); } } }
3. 动态合并原有默认值(避免硬编码)
如果不想硬编码OTel原生的默认传播器,可以通过ConfigurationBuildItem读取当前的默认值,再拼接自定义传播器:
import io.quarkus.deployment.builditem.ConfigDefaultsBuildItem; import io.quarkus.deployment.builditem.ConfigurationBuildItem; import io.quarkus.deployment.annotations.BuildStep; class YourExtensionProcessor { @BuildStep(onlyIf = IsOpenTelemetryEnabled.class) ConfigDefaultsBuildItem configureOtelPropagators(ConfigurationBuildItem configuration) { // 读取OTel传播器的现有默认值 String existingDefault = configuration.getDefaultValue("quarkus.otel.propagators"); // 拼接自定义传播器 String newDefault = existingDefault + ",your-custom-propagator"; return ConfigDefaultsBuildItem.builder() .setDefaults("quarkus.otel.propagators", newDefault) .build(); } // 同上文的IsOpenTelemetryEnabled类 }
这种方式能适配OTel后续版本对默认传播器的修改,无需手动更新扩展代码。
内容的提问来源于stack exchange,提问作者Skod
相关产品推荐
相关产品推荐

