quarkus
quarkus copied to clipboard
`@UnlessBuildProperty` does not work properly if `io.quarkus:quarkus-rest` in the dependencies.
Describe the bug
after updating to version >3.5.3 (e.g. 3.9.4), the application stopped working.
I have a demo project to reproduce issue: https://github.com/sszuev/play-quarkus
the application contains quarkus-kafka-streams
& quarkus-rest
.
It contains one class-producer:
import io.quarkus.arc.properties.UnlessBuildProperty
import jakarta.enterprise.context.ApplicationScoped
import jakarta.enterprise.inject.Produces
import org.apache.kafka.streams.StreamsBuilder
import org.apache.kafka.streams.Topology
@ApplicationScoped
@UnlessBuildProperty(name = "app.config.topics", stringValue = "", enableIfMissing = false)
class AppTopologyFactory {
@Produces
fun buildTopology(): Topology = StreamsBuilder().build()
}
application.properties:
app.config.topics=
gradle-dependencies:
dependencies {
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
implementation 'io.quarkus:quarkus-kotlin'
implementation 'io.quarkus:quarkus-kafka-streams'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
implementation 'io.quarkus:quarkus-arc'
implementation 'commons-codec:commons-codec'
implementation 'io.quarkus:quarkus-rest'
}
Expected behavior
no errors is expected; the initialization of kafka-streams should be skipped with warning
Actual behavior
2024-04-26 17:34:58,629 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: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1508)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:320)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:160)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
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:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:638)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:308)
... 14 more
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:334)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:251)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:112)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:433)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:55)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1508)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:320)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:160)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
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:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:638)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:308)
... 14 more
at io.quarkus.builder.Execution.run(Execution.java:123)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:160)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:330)
... 9 more
Caused by: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1508)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:320)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:160)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
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:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.streams.Topology and qualifiers [@Default]
- injection target: io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService#topology
- declared on CLASS bean [types=[java.lang.Object, io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService], qualifiers=[@Default, @Any], target=io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService]
at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:638)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:308)
... 14 more
How to Reproduce?
- git clone https://github.com/sszuev/play-quarkus
- gradlew quarkusDev
Output of uname -a
or ver
windows11,x64
Output of java -version
17.0.6
Quarkus version or git rev
3.9.4
Build tool (ie. output of mvnw --version
or gradlew --version
)
8.6
Additional information
the application works fine if there is no io.quarkus:quarkus-rest
in the dependencies
is there any workaround? this bug blocks updating the business application to the latest version
/cc @geoand (kotlin)
Thanks for reporting.
Is there any chance you narrowed down which version actually introduced the breakage?
Thanks for reporting.
Is there any chance you narrowed down which version actually introduced the breakage?
3.6.0.CR1 - FAIL; (3.5.3 - OK)
Thanks!
The build only fails with UnsatisfiedResolutionException
in the dev mode because Topology
is a dependency of a Dev UI bean - io.quarkus.kafka.streams.runtime.devui.KafkaStreamsJsonRPCService
- that was introduced in 3.6.0.CR1.
Now I have no idea how the Dev UI for kafka streams is supposed to work if you don't provide a Topology
bean :shrug:.
CC @dcotfr @gunnarmorling