quarkusio / quarkus

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

`@UnlessBuildProperty` does not work properly if `io.quarkus:quarkus-rest` in the dependencies. #40315

Open sszuev opened 2 months ago

sszuev commented 2 months ago

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?

  1. git clone https://github.com/sszuev/play-quarkus
  2. 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

quarkus-bot[bot] commented 2 months ago

/cc @geoand (kotlin)

geoand commented 2 months ago

Thanks for reporting.

Is there any chance you narrowed down which version actually introduced the breakage?

sszuev commented 2 months ago

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)

geoand commented 2 months ago

Thanks!