Skip to content

java.lang.ClassNotFoundException: org.eclipse.microprofile.metrics.MetricRegistry #450

@FabioBentoLuiz

Description

@FabioBentoLuiz

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?

  1. 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
  2. Build the application:
    ./gradlew build
  3. Build the docker image:
    docker build -f src/main/docker/Dockerfile.jvm -t quarkus/getting-started-jvm .
  4. 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 .

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions