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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:42:37