(https://drive.google.com/file/d/1VhiNjbatpojBah1XOaYRBN8NKWDMkzpw/view?usp=sharing)

Have been hitting this issue regularly with SpringBoot 3.4.x

Above is complete yet minimal sample that reproduces the problem. 2 sets of command produce similar but not identical errors.

Below are the commands to recreate it with Gradle 7.6.4 and Graal Java(TM) SE Runtime Environment Oracle GraalVM 17.0.11+7.1

1. gradle build -x test :microservices:review-service:nativeCompile -Pprofile=instrumented && docker compose -f docker-compose-app-native-instrumented.yml build && docker compose -f docker-compose-app-native-instrumented.yml up

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': null
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
native-query-error3-review-1  |     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
native-query-error3-review-1  |     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
native-query-error3-review-1  |     at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
native-query-error3-review-1  |     at com.stillwaters.playground.microservices.core.review.ReviewServiceApplication.main(ReviewServiceApplication.java:45)
native-query-error3-review-1  | Caused by: java.lang.ExceptionInInitializerError
native-query-error3-review-1  |     at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54)
native-query-error3-review-1  |     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
native-query-error3-review-1  |     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
native-query-error3-review-1  |     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
native-query-error3-review-1  |     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808)
native-query-error3-review-1  |     ... 15 more
native-query-error3-review-1  | Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.internal.EntityManagerMessageLogger (implementation not found)
native-query-error3-review-1  |     at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2630)
native-query-error3-review-1  |     at org.jboss.logging.Logger.getMessageLogger(Logger.java:2570)
native-query-error3-review-1  |     at org.jboss.logging.Logger.getMessageLogger(Logger.java:2552)
native-query-error3-review-1  |     at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
native-query-error3-review-1  |     at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
native-query-error3-review-1  |     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<clinit>(EntityManagerFactoryBuilderImpl.java:144)
native-query-error3-review-1  |     ... 22 more
native-query-error3-review-1 exited with code 1

2. gradle build -x test :microservices:review-service:bootBuildImage && docker compose -f docker-compose-app-native.yml up

Application run failed
native-query-error3-review-1  | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': null
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
native-query-error3-review-1  |     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
native-query-error3-review-1  |     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
native-query-error3-review-1  |     at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
native-query-error3-review-1  |     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
native-query-error3-review-1  |     at com.stillwaters.playground.microservices.core.review.ReviewServiceApplication.main(ReviewServiceApplication.java:45)
native-query-error3-review-1  | Caused by: java.lang.ExceptionInInitializerError
native-query-error3-review-1  |     at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:157)
native-query-error3-review-1  |     at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81)
native-query-error3-review-1  |     at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
native-query-error3-review-1  |     at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
native-query-error3-review-1  |     at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
native-query-error3-review-1  |     at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
native-query-error3-review-1  |     at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
native-query-error3-review-1  |     at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226)
native-query-error3-review-1  |     at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:194)
native-query-error3-review-1  |     at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
native-query-error3-review-1  |     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442)
native-query-error3-review-1  |     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513)
native-query-error3-review-1  |     at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
native-query-error3-review-1  |     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
native-query-error3-review-1  |     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
native-query-error3-review-1  |     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
native-query-error3-review-1  |     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859)
native-query-error3-review-1  |     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808)
native-query-error3-review-1  |     ... 15 more
native-query-error3-review-1  | Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.internal.log.ConnectionInfoLogger (implementation not found)
native-query-error3-review-1  |     at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2630)
native-query-error3-review-1  |     at org.jboss.logging.Logger.getMessageLogger(Logger.java:2570)
native-query-error3-review-1  |     at org.jboss.logging.Logger.getMessageLogger(Logger.java:2552)
native-query-error3-review-1  |     at org.hibernate.internal.log.ConnectionInfoLogger.<clinit>(ConnectionInfoLogger.java:38)
native-query-error3-review-1  |     ... 34 more
native-query-error3-review-1 exited with code 1

Any help will be greatly appreciated.

Comment From: wilkinsona

Please take the previously recommended steps:

To investigate your problem, I would start by using an up-to-date version of the org.graalvm.buildtools.native. If that doesn't help and you require further assistance, please ask a question on Stack Overflow that provides a truly minimal way to reproduce the problem.

Comment From: klopfdreh

Even if the ticket is closed I was facing the same issue using Spring Boot 3.5.5

We are using the following native-maven-plugin version: 0.11.0:

                <plugin>
                    <groupId>org.graalvm.buildtools</groupId>
                    <artifactId>native-maven-plugin</artifactId>
                    <version>0.11.0</version>
                    <executions>
                        <execution>
                            <id>add-reachability-metadata</id>
                            <goals>
                                <goal>add-reachability-metadata</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
                        <metadataRepository>
                            <enabled>true</enabled>
                        </metadataRepository>
                        <requiredVersion>22.3</requiredVersion>
                    </configuration>
                </plugin>

I was able to fix the issue by manually adding the classes of the package org/hibernate/internal and the classes of subpackages using the following code.

/**
 * Generates hints for the backend application.
 */
@Configuration
@ImportRuntimeHints(de.axa.lok.backend.aot.BackendRuntimeHints.class)
@Slf4j
public class BackendRuntimeHints implements RuntimeHintsRegistrar {

    @Override
    public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
        Arrays.stream(System.getProperty("java.class.path").split(File.pathSeparator)).forEach(classpathEntry -> {
            // If the classpathEntry is no jar skip it
            if (!classpathEntry.endsWith(".jar")) {
                return;
            }

            try (JarInputStream is = new JarInputStream(Files.newInputStream(Path.of(classpathEntry)))) {
                JarEntry entry = is.getNextJarEntry();
                while (entry != null) {
                    String entryName = entry.getName();
                    if (entryName.endsWith(".class")
                        && !entryName.contains("package-info")
                        && entryName.startsWith("org/hibernate/internal")
                    ) {
                        String githubApiClassName = entryName.replace("/", ".");
                        String githubApiClassNameWithoutClass = githubApiClassName.substring(0, githubApiClassName.length() - 6);
                        log.info("Registered class {} for reflections and serialization.", githubApiClassNameWithoutClass);
                        hints.reflection().registerType(TypeReference.of(githubApiClassNameWithoutClass), MemberCategory.values());
                        hints.serialization().registerType(TypeReference.of(githubApiClassNameWithoutClass));
                    }

                    entry = is.getNextJarEntry();
                }
            } catch (IOException e) {
                log.warn("Error while reading jars", e);
            }
        });
    }
}

The weird thing is that in some other applications we don't have any problems with hibernate and native-images, because the metadata of https://github.com/oracle/graalvm-reachability-metadata/tree/master/metadata/org.hibernate/hibernate-core are used and the related reflection and resource information are added.

In our backend however we are using flyway and defining custom entites, there the metadata is not used somehow, but I can't nail down where the issue comes from.