-
Notifications
You must be signed in to change notification settings - Fork 18
Description
Describe the bug
I have a quarkus project that depends on quarkus-reactive-messaging-http:2.4.1 and quarkus-micrometer-registry-prometheus.
After building and deploying, the docker container cannot start and shows the following exception:
Exception in thread "main" java.lang.reflect.InvocationTargetException 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:569) at io.quarkus.bootstrap.runner.QuarkusEntryPoint.doRun(QuarkusEntryPoint.java:62) at io.quarkus.bootstrap.runner.QuarkusEntryPoint.main(QuarkusEntryPoint.java:33) Caused by: java.lang.ExceptionInInitializerError 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:500) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) at io.quarkus.runtime.Quarkus.run(Quarkus.java:70) at io.quarkus.runtime.Quarkus.run(Quarkus.java:44) at io.quarkus.runtime.Quarkus.run(Quarkus.java:124) at io.quarkus.runner.GeneratedMain.main(Unknown Source) ... 6 more Caused by: java.lang.RuntimeException: Failed to start quarkus at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source) ... 15 more Caused by: java.lang.NoClassDefFoundError: org/eclipse/microprofile/metrics/MetricRegistry at java.base/java.lang.Class.getDeclaredFields0(Native Method) at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3297) at java.base/java.lang.Class.getDeclaredField(Class.java:2608) at io.quarkus.arc.impl.Reflections.findFieldInternal(Reflections.java:69) at io.quarkus.arc.impl.Reflections$1.apply(Reflections.java:38) at io.quarkus.arc.impl.Reflections$1.apply(Reflections.java:35) at io.quarkus.arc.impl.ComputingCache$1.get(ComputingCache.java:52) at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32) at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69) at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:49) at io.quarkus.arc.impl.ComputingCache.getValue(ComputingCache.java:40) at io.quarkus.arc.impl.Reflections.findField(Reflections.java:64) at io.smallrye.reactive.messaging.providers.metrics.MetricDecorator_Bean.<init>(Unknown Source) at io.quarkus.arc.setup.Default_ComponentsProvider.addBeans3(Unknown Source) at io.quarkus.arc.setup.Default_ComponentsProvider.getComponents(Unknown Source) at io.quarkus.arc.impl.ArcContainerImpl.<init>(ArcContainerImpl.java:128) at io.quarkus.arc.Arc.initialize(Arc.java:38) at io.quarkus.arc.runtime.ArcRecorder.initContainer(ArcRecorder.java:52) at io.quarkus.deployment.steps.ArcProcessor$initializeContainer1770303700.deploy_0(Unknown Source) at io.quarkus.deployment.steps.ArcProcessor$initializeContainer1770303700.deploy(Unknown Source) ... 16 more Caused by: java.lang.ClassNotFoundException: org.eclipse.microprofile.metrics.MetricRegistry 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:525) at io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:114) at io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:72) ... 36 more
Expected behaviour
The docker container and quarkus application should start without errors, as it starts under development.
Actual behaviour
The application starts and runs without problem on the local machine / IDE, but fails to start after build and deployment with docker container.
How to Reproduce?
- Create a new quarkus project with the given dependencies:
quarkus create app org.acme:getting-started --extension='rest, reactive-messaging-http,micrometer-registry-prometheus' --gradle
- Build the application:
./gradlew build
- Build the docker image:
docker build -f src/main/docker/Dockerfile.jvm -t quarkus/getting-started-jvm .
- Start the container:
docker run -i --rm -p 8080:8080 quarkus/getting-started-jvm
Output of uname -a
x86_64 x86_64 x86_64 GNU/Linux
(I have the same issue also if I build it in a macOS)
Java version
21
Quarkus version
3.17.7 (also tried with 3.17.4 and 3.17.6 with the same error)
Build tool
Gradle 8.9
Additional information
The build (./gradlew build) succeeds with the following warning:
Failed to index org.eclipse.microprofile.metrics.annotation.RegistryType: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for getting-started-1.0.0-SNAPSHOT@1b346792
The workaround I've used in my production code is to add Support for the MicroProfile Metrics API:
implementation("org.eclipse.microprofile.metrics:microprofile-metrics-api")
I've also reported the issue to quarkus-reactive-messaging-http .