Search code examples
javagoogle-cloud-firestoremicronautgraalvmgraalvm-native-image

Error: Classes that should be initialized at run time got initialized during image building: org.conscrypt.Conscrypt was unintentionally initialized


Using Java 11.0.9 (GraalVM CE 20.3.0) wth a Micronaut 2.2.1 app making use of Firebase admin 7.1.0, when I package my app as a native image according to the Micronaut documentation, I get the following error:

$ ./gradlew nativeImage 
> Task :nativeImage
[application:15026]    classlist:   4,054.46 ms,  1.19 GB
[application:15026]        (cap):     504.32 ms,  1.19 GB
[application:15026]        setup:   1,827.02 ms,  1.19 GB
To see how the classes got initialized, use --trace-class-initialization=org.conscrypt.Conscrypt,org.conscrypt.OpenSSLProvider
[application:15026]     analysis:  29,787.52 ms,  3.90 GB
Error: Classes that should be initialized at run time got initialized during image building:
 org.conscrypt.Conscrypt was unintentionally initialized at build time. To see why org.conscrypt.Conscrypt got initialized use --trace-class-initialization=org.conscrypt.Conscrypt
org.conscrypt.OpenSSLProvider was unintentionally initialized at build time. To see why org.conscrypt.OpenSSLProvider got initialized use --trace-class-initialization=org.conscrypt.OpenSSLProvider

Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1

> Task :nativeImage FAILED

FAILURE: Build failed with an exception.

The issue is caused by classes from the package org.conscrypt. The related dependency is from com.google.cloud:google-cloud-firestore:1.35.0 that fetches org.conscrypt:conscrypt-openjdk-uber:2.2.1.

I am really new with GraalVM and far from understanding the cause of such an issue. However, I noticed it should be possible to pass to native-image some parameters, such as --initialize-at-build-time.

My question is how to fix this issue? is there a configuration file to create and that Micronaut reads from options to forward to the native-image executable?


Solution

  • The issue is caused by com.google.cloud:google-cloud-firestore:1.35.0 and how it uses its dependencies. This dependency does not support native images out of the box.

    There is an ongoing effort to add support for GraalVM in this official repository: https://github.com/GoogleCloudPlatform/google-cloud-graalvm-support

    Adding this library as a compile dependency fixes the issue.

    Regarding native-image configuration with Micronaut, you can pass options via a configuration file. Let's say your groupId is com.acme and your artifactId is acme-module1, then you need to create in your project the file src/main/resources/META-INF/native-image/com/acme/acme-module1/native-image.properties with your content:

    Args = ...