Skip to content

Quarkus fails to start up with composite Gradle build when using Kotlin (Java works correctly) #47430

@lspahija

Description

@lspahija

Describe the bug

When both the root gradle project and the gradle subproject in a composite gradle build use Quarkus with Kotlin, the project throws a runtime exception and fails to start up.

Expected behavior

The project starts up successfully.

Actual behavior

The following exception is thrown at runtime and the project fails to start up:

2025-04-17 14:01:57,148 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.example.SomeBean and qualifiers [@Default]
        - injection target: parameter 'someBean' of org.example.ExampleResource constructor
        - declared on CLASS bean [types=[org.example.ExampleResource, java.lang.Object], qualifiers=[@Default, @Any], target=org.example.ExampleResource]
        at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1581)
        at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338)
        at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:178)
        at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:489)
        at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:856)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:255)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2675)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2654)
        at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1627)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1594)
        at java.base/java.lang.Thread.run(Thread.java:1583)
        at org.jboss.threads.JBossThread.run(JBossThread.java:499)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.example.SomeBean and qualifiers [@Default]
        - injection target: parameter 'someBean' of org.example.ExampleResource constructor
        - declared on CLASS bean [types=[org.example.ExampleResource, java.lang.Object], qualifiers=[@Default, @Any], target=org.example.ExampleResource]
        at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:547)
        at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:689)
        at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:323)
        ... 12 more

If the root project doesn't inject any beans from the dependency and instead only accesses a plain Kotlin class from the dependency, then this exception is thrown instead and the project still fails to start up:

2025-04-17 14:12:09,066 WARN  [io.qua.dep.ste.ReflectiveHierarchyStep] (build-4) Unable to properly register the hierarchy of the following classes for reflection as they are not in the Jandex index:
     - org.example.SomeDataClass (source: ResteasyReactiveProcessor > org.example.ExampleResource[org.example.SomeDataClass hello()] > org.example.SomeDataClass > org.example.SomeDataClass)
Consider adding them to the index either by creating a Jandex index for your dependency via the Maven plugin, an empty META-INF/beans.xml or quarkus.index-dependency properties.
2025-04-17 14:12:09,126 ERROR [io.qua.run.Quarkus] (Quarkus Main Thread) Error running Quarkus: java.lang.ExceptionInInitializerError
        at java.base/jdk.internal.misc.Unsafe.allocateInstance(Native Method)
        at java.base/java.lang.invoke.DirectMethodHandle.allocateInstance(DirectMethodHandle.java:501)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:79)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:51)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:144)
        at io.quarkus.runner.GeneratedMain.main(Unknown Source)
        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.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:116)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.RuntimeException: Failed to start quarkus
        at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source)
        ... 10 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.example.SomeDataClass
        at org.jboss.resteasy.reactive.common.util.types.TypeSignatureParser.loadClass(TypeSignatureParser.java:165)
        at org.jboss.resteasy.reactive.common.util.types.TypeSignatureParser.parseReference(TypeSignatureParser.java:146)
        at org.jboss.resteasy.reactive.common.util.types.TypeSignatureParser.parseType(TypeSignatureParser.java:54)
        at org.jboss.resteasy.reactive.common.util.types.TypeSignatureParser.parse(TypeSignatureParser.java:170)
        at org.jboss.resteasy.reactive.server.core.startup.RuntimeResourceDeployment.buildResourceMethod(RuntimeResourceDeployment.java:389)
        at org.jboss.resteasy.reactive.server.core.startup.RuntimeDeploymentManager.deploy(RuntimeDeploymentManager.java:137)
        at io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRecorder.createDeployment(ResteasyReactiveRecorder.java:161)
        at io.quarkus.runner.recorded.ResteasyReactiveProcessor$setupDeployment944680882.deploy_0(Unknown Source)
        at io.quarkus.runner.recorded.ResteasyReactiveProcessor$setupDeployment944680882.deploy(Unknown Source)
        ... 11 more
Caused by: java.lang.ClassNotFoundException: org.example.SomeDataClass
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:569)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:517)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:569)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:517)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:534)
        at java.base/java.lang.Class.forName(Class.java:513)
        at org.jboss.resteasy.reactive.common.util.types.TypeSignatureParser.loadClass(TypeSignatureParser.java:163)
        ... 19 more

How to Reproduce?

Reproducer: https://github.com/lspahija/quarkus-complex-build-bug-reproducer

There are two branches: not-working-kotlin (default branch) and works-java

Steps to reproduce the behavior:

  1. git clone https://github.com/lspahija/quarkus-complex-build-bug-reproducer
  2. cd quarkus-complex-build-bug-reproducer
  3. ./gradlew quarkusDev
  4. see exception in the console and note that the project has failed to start up

If you wish to see the equivalent java project working successfully:

  1. git checkout works-java
  2. ./gradlew quarkusDev
  3. note that everything works fine

Output of uname -a or ver

Darwin MacBookPro 24.3.0 Darwin Kernel Version 24.3.0: Thu Jan 2 20:24:16 PST 2025; root:xnu-11215.81.4~3/RELEASE_ARM64_T6000 arm64

Output of java -version

openjdk version "21.0.6" 2025-01-21 LTS OpenJDK Runtime Environment Zulu21.40+17-CA (build 21.0.6+7-LTS) OpenJDK 64-Bit Server VM Zulu21.40+17-CA (build 21.0.6+7-LTS, mixed mode, sharing)

Quarkus version or git rev

3.21.3

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

Gradle 8.12

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    3.20.3

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions