quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.35k stars 2.56k forks source link

Application fails to start in dev mode if kafka-streams extension is present #41432

Open fedinskiy opened 1 week ago

fedinskiy commented 1 week ago

Describe the bug

I have an application, which contains kafka-streams dependency. When I start the application in a dev mode, it fails with UnsatisfiedResolutionException in Quarkus code.

Expected behavior

Application shouldn't fail, or should tell user, that must be fixed in the application/configs/environment.

Actual behavior

2024-06-25 16:01:33,700 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:1529)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
    at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
    at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    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:1583)
    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:642)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
    ... 12 more

    at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331)
    at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
    at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:58)
    at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:113)
    at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:435)
    at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:56)
    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:1529)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
    at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
    at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    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:1583)
    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:642)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
    ... 12 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:327)
    ... 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:1529)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
    at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
    at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    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:1583)
    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:642)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
    ... 12 more

How to Reproduce?

  1. Create the app: wget -O app.zip 'https://code.quarkus.io/d?e=rest&e=kafka-streams&e=messaging-kafka&cn=code.quarkus.io'
  2. Unpack it: unzip -q app.zip && cd code-with-quarkus/
  3. mvn quarkus:dev

If the app is built and run in prod mode, it starts without any problem:

  1. mvn clean install && java -jar target/quarkus-app/quarkus-run.jar If the kafka-streams is removed, the app works in dev mode as well:
  2. quarkus extension remove kafka-streams
  3. mvn quarkus:dev

Output of uname -a or ver

6.7.3-200.fc39.x86_64

Output of java -version

Java version: 21.0.1, vendor: Eclipse Adoptium

Quarkus version or git rev

3.11.3

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

Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)

Additional information

No response

quarkus-bot[bot] commented 1 week ago

/cc @alesj (kafka,kafka-streams), @cescoffier (kafka), @gunnarmorling (kafka-streams), @ozangunalp (kafka,kafka-streams), @rquinio (kafka-streams)

rquinio commented 1 week ago

@fedinskiy You need to produce a bean of type org.apache.kafka.streams.Topology, for instance https://github.com/quarkusio/quarkus-quickstarts/blob/4741f553ce3f2b3ee8549816a7cba4eca0931f68/kafka-streams-quickstart/aggregator/src/main/java/org/acme/kafka/streams/aggregator/streams/TopologyProducer.java#L33

There's the extension https://github.com/quarkiverse/quarkus-kafka-streams-processor that will automatically produce a Topology based on configuration, but it's limited to simple Processors.

fedinskiy commented 1 week ago

@rquinio thank you for your advice! Is it possible to have this as a dev mode error instead of UnsatisfiedResolutionException? Also:

  1. For prod mode it's just a warning, not an error. Is this intended?
  2. Maybe we should have some kind of example topology in autogenerated (via cli and code.quarkus ) apps as well.