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)
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 (?).
It depends on the required qualifier. I.e.
@Inject Optional<ExemplarSampler>
(which corresponds to@Inject @Default Optional<ExemplarSampler>
) is ok and is satisfied by theexemplarSampler()
but@Inject @Any Optional<ExemplarSampler>
would result in anAmbiguousResolutionException
because bothexemplarSampler()
andproduceOptionalConfigProperty()
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…cc @aloubyansky @glefloch
@mkouba By app setup, you mean the
build.gradle.kts
and whatnot?If so yeah I can definitely put one of those together`