quarkus: Failed to start quarkus in 2.16.0.Final: `Ambiguous dependencies for type java.util.Optional and qualifiers [@Default]`

Describe the bug

It looks like a conflict between:

  • io.smallrye.config.inject.ConfigProducer
  • io.quarkus.micrometer.runtime.export.OpentelemetryExemplarSamplerProvider

Dependencies are:

implementation(platform("$quarkusPlatformGroupId:$quarkusPlatformArtifactId:$quarkusPlatformVersion"))
implementation("io.quarkus:quarkus-agroal")
implementation("io.quarkus:quarkus-arc")
implementation("io.quarkus:quarkus-cache")
implementation("io.quarkus:quarkus-kotlin")
implementation("io.quarkus:quarkus-micrometer-registry-prometheus")
implementation("io.quarkus:quarkus-resteasy-reactive")
implementation("io.quarkus:quarkus-resteasy-reactive-jackson")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:${GlobalVersions.jackson}")
implementation("io.quarkus:quarkus-smallrye-fault-tolerance")
implementation("io.quarkus:quarkus-smallrye-openapi")
implementation("io.quarkus:quarkus-vertx")
implementation("io.quarkus:quarkus-reactive-routes")

implementation("io.quarkus:quarkus-opentelemetry")
implementation("io.opentelemetry:opentelemetry-extension-kotlin")
implementation("io.opentelemetry.instrumentation:opentelemetry-jdbc")

Error is:

2023-01-25 12:56:09,282 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.AmbiguousResolutionException: Ambiguous dependencies for type java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> and qualifiers [@Default]
        - java member: io.quarkus.micrometer.runtime.export.PrometheusMeterRegistryProducer#registry():exemplarSampler
        - declared on PRODUCER METHOD bean [types=[io.micrometer.core.instrument.MeterRegistry, java.lang.Object, io.micrometer.prometheus.PrometheusMeterRegistry], qualifiers
=[@Default, @Any], target=io.micrometer.prometheus.PrometheusMeterRegistry registry(io.micrometer.prometheus.PrometheusConfig config, io.prometheus.client.CollectorRegistry co
llectorRegistry, java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> exemplarSampler, io.micrometer.core.instrument.Clock clock), declaringBean=io.quarkus.micrometer.runtime.export.PrometheusMeterRegistryProducer]
        - available beans:
                - PRODUCER METHOD bean [types=[java.util.Optional<T>, java.lang.Object], qualifiers=[@Default, @Any], target=java.util.Optional<T> produceOptionalConfigProperty(javax.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
                - PRODUCER METHOD bean [types=[java.lang.Object, java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler>], qualifiers=[@Default, @Any], target=java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> exemplarSampler(), declaringBean=io.quarkus.micrometer.runtime.export.OpentelemetryExemplarSamplerProvider]      
        at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1223)
        at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:288)
        at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:148)
        at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:526)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:909)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at java.base/java.lang.Thread.run(Thread.java:833)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: javax.enterprise.inject.AmbiguousResolutionException: Ambiguous dependencies for type java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> and qualifiers [@Default]
        - java member: io.quarkus.micrometer.runtime.export.PrometheusMeterRegistryProducer#registry():exemplarSampler
        - declared on PRODUCER METHOD bean [types=[io.micrometer.core.instrument.MeterRegistry, java.lang.Object, io.micrometer.prometheus.PrometheusMeterRegistry], qualifiers
=[@Default, @Any], target=io.micrometer.prometheus.PrometheusMeterRegistry registry(io.micrometer.prometheus.PrometheusConfig config, io.prometheus.client.CollectorRegistry co
llectorRegistry, java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> exemplarSampler, io.micrometer.core.instrument.Clock clock), declaringBean=io.quarkus.micrometer.runtime.export.PrometheusMeterRegistryProducer]
        - available beans:
                - PRODUCER METHOD bean [types=[java.util.Optional<T>, java.lang.Object], qualifiers=[@Default, @Any], target=java.util.Optional<T> produceOptionalConfigProperty(javax.enterprise.inject.spi.InjectionPoint ip), declaringBean=io.smallrye.config.inject.ConfigProducer]
                - PRODUCER METHOD bean [types=[java.lang.Object, java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler>], qualifiers=[@Default, @Any], target=java.util.Optional<io.prometheus.client.exemplars.ExemplarSampler> exemplarSampler(), declaringBean=io.quarkus.micrometer.runtime.export.OpentelemetryExemplarSamplerProvider]      
        at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:449)
        at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:539)
        at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:276)
        ... 13 more

        at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:335)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:86)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:447)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:59)
        at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:149)
        at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:104)
        at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
        at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

No response

Output of uname -a or ver

No response

Output of java -version

No response

GraalVM version (if different from Java)

No response

Quarkus version or git rev

No response

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 41 (37 by maintainers)

Most upvoted comments

Yes, I know. I’d like to understand the cause though. I don’t see how it is specific to Gradle so far and want to make sure we fixed the cause properly.

@aloubyansky I’ve just tried to build the app with the main branch and the error is gone (?).

is this supposed to resolve properly?

It depends on the required qualifier. I.e. @Inject Optional<ExemplarSampler> (which corresponds to @Inject @Default Optional<ExemplarSampler> ) is ok and is satisfied by the exemplarSampler() but @Inject @Any Optional<ExemplarSampler> would result in an AmbiguousResolutionException because both exemplarSampler() and produceOptionalConfigProperty() are eligible.

As I mentioned in https://github.com/quarkusio/quarkus/issues/30616#issuecomment-1404653857 from the error message it looks like if the qualifiers of produceOptionalConfigProperty() are [@Default, @Any] instead of [@ConfigProperty, @Any]. Maybe for some reason the @ConfigProperty is not registered as a qualifier…

@mkouba By app setup, you mean the build.gradle.kts and whatnot?

If so yeah I can definitely put one of those together`