Description:
I'm building a Quarkus project using Gradle, and during the quarkusGenerateCode task, I encounter the following error:
./gradlew clean build ✔
> Task :quarkusGenerateCode
2025-02-16T15:12:40.186701Z /127.0.0.1:60733 to /127.0.0.1:60732 workers ERROR Unable to create Lookup for ctx java.lang.NoSuchMethodError: 'java.util.stream.Stream .apache.logging.log4j.util.ServiceLoaderUtil.loadServices(java.lang.Class, java.lang.invoke.MethodHandles$Lookup, boolean)'
at .apache.logging.log4j.core.impl.ThreadContextDataInjector.getServiceProviders(ThreadContextDataInjector.java:77)
at .apache.logging.log4j.core.impl.ThreadContextDataInjector.<clinit>(ThreadContextDataInjector.java:64)
at .apache.logging.log4j.core.impl.ThreadContextDataInjector$ForDefaultThreadContextMap.<init>(ThreadContextDataInjector.java:93)
at .apache.logging.log4j.core.impl.ContextDataInjectorFactory.createDefaultInjector(ContextDataInjectorFactory.java:91)
at .apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector(ContextDataInjectorFactory.java:71)
at .apache.logging.log4j.core.lookup.ContextMapLookup.<init>(ContextMapLookup.java:34)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at .apache.logging.log4j.core.util.ReflectionUtil.instantiate(ReflectionUtil.java:189)
at .apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:86)
at .apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:105)
at .apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:135)
at .apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
at .apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:74)
at .apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254)
at .apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
at .apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:140)
at .apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123)
at .apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:230)
at .apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
at .apache.logging.log4j.LogManager.getContext(LogManager.java:118)
at .apache.logging.log4j.LogManager.getLogger(LogManager.java:622)
at .jboss.logging.Log4j2Logger.<init>(Log4j2Logger.java:36)
at .jboss.logging.Log4j2LoggerProvider.getLogger(Log4j2LoggerProvider.java:36)
at .jboss.logging.Log4j2LoggerProvider.getLogger(Log4j2LoggerProvider.java:32)
at .jboss.logging.LoggerProviders.logProvider(LoggerProviders.java:160)
at .jboss.logging.LoggerProviders.tryLog4j2(LoggerProviders.java:124)
at .jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:85)
at .jboss.logging.LoggerProviders.find(LoggerProviders.java:32)
at .jboss.logging.LoggerProviders.<clinit>(LoggerProviders.java:29)
at .jboss.logging.Logger.getLogger(Logger.java:2467)
at .jboss.logging.Logger.getLogger(Logger.java:2493)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.<clinit>(QuarkusClassLoader.java:38)
at io.quarkus.bootstrap.app.CuratedApplication.getOrCreateAugmentClassLoader(CuratedApplication.java:197)
at io.quarkus.bootstrap.app.CuratedApplication.createDeploymentClassLoader(CuratedApplication.java:338)
at io.quarkus.gradle.tasks.worker.CodeGenWorker.execute(CodeGenWorker.java:48)
at .gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
at .gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
at .gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
at .gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
at .gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
at .gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
at .gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
at .gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:109)
at .gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:78)
at .gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:159)
at .gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
at .gradle.process.internal.worker.request.WorkerAction.lambda$run$1(WorkerAction.java:156)
at .gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at .gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:148)
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 .gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at .gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at .gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
at .gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
at .gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
at .gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at .gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:842)
Project Structure
My root project contains both Spring Boot and Quarkus subprojects. The Spring Boot subproject requires the shadow plugin to generate a fat JAR for AWS Lambda deployment. However, when I declare the shadow plugin in the root build.gradle.kts, Quarkus fails to generate code locally.
Reproduction Steps
This issue occurs when I add shadow in the root build.gradle.kts:
Root build.gradle.kts
plugins {
kotlin("jvm") version "2.0.21"
id("com.github.johnrengelman.shadow") version "8.1.1" apply false
id("io.quarkus") version "3.18.2"
}
repositories {
mavenCentral()
gradlePluginPortal()
}
dependencies {
}
group = "com.example"
version = "1.0.0-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
When apply false is added to the shadow plugin, the quarkusGenerateCode task fails. Removing this fixes the issue, but then my Spring Boot project cannot use the shadowJar build.
Question
How can I configure Gradle so that:
Spring Boot projects can still use the shadow plugin. Quarkus projects do not fail on quarkusGenerateCode. Root project remains the common configuration without causing conflicts between Quarkus and Spring Boot. Is there a way to apply shadow only in Spring Boot subprojects while keeping the root project clean and avoiding the quarkusGenerateCode issue? Any workaround to prevent Quarkus from breaking due to shadow in the root project?
Thanks.