khrabar
khrabar

Reputation: 51

Caused by: java.lang.NoSuchMethodException: org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>()

Trying to create a native image using GraalVM and Spring Boot. The app itself works when i use the mvn spring-boot:run command, but when I build my native image and try to run it, I get this exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': org.hibernate.bytecode.spi.BytecodeProvider: org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl Unable to get public no-arg constructor
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[app:6.1.5]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[app:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1234) ~[app:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) ~[app:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) ~[app:6.1.5]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[na:na]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[app:3.2.4]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[app:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[app:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[app:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[app:3.2.4]
    at com.library.app.AppApplication.main(AppApplication.java:10) ~[app:na]
    at java.base@22/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH) ~[na:na]
Caused by: java.util.ServiceConfigurationError: org.hibernate.bytecode.spi.BytecodeProvider: org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl Unable to get public no-arg constructor
    at java.base@22/java.util.ServiceLoader.fail(ServiceLoader.java:582) ~[app:na]
    at java.base@22/java.util.ServiceLoader.getConstructor(ServiceLoader.java:675) ~[app:na]
    at java.base@22/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1236) ~[na:na]
    at java.base@22/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1269) ~[na:na]
    at java.base@22/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1305) ~[na:na]
    at java.base@22/java.util.ServiceLoader$ProviderSpliterator.tryAdvance(ServiceLoader.java:1485) ~[na:na]
    at java.base@22/java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681) ~[na:na]
    at org.hibernate.boot.registry.classloading.internal.AggregatedServiceLoader$ClassPathAndModulePathAggregatedServiceLoader.loadAll(AggregatedServiceLoader.java:123) ~[na:na]
    at org.hibernate.boot.registry.classloading.internal.AggregatedServiceLoader$ClassPathAndModulePathAggregatedServiceLoader.getAll(AggregatedServiceLoader.java:112) ~[na:na]
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:241) ~[na:na]
    at org.hibernate.bytecode.internal.BytecodeProviderInitiator.initiateService(BytecodeProviderInitiator.java:50) ~[na:na]
    at org.hibernate.bytecode.internal.BytecodeProviderInitiator.initiateService(BytecodeProviderInitiator.java:22) ~[na:na]
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) ~[na:na]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[app:6.4.4.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[app:6.4.4.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[app:6.4.4.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.<init>(SessionFactoryBuilderImpl.java:69) ~[na:na]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.<init>(SessionFactoryBuilderImpl.java:46) ~[na:na]
    at org.hibernate.boot.internal.DefaultSessionFactoryBuilderService.createSessionFactoryBuilder(DefaultSessionFactoryBuilderService.java:26) ~[app:6.4.4.Final]
    at org.hibernate.boot.internal.MetadataImpl.getSessionFactoryBuilder(MetadataImpl.java:170) ~[app:6.4.4.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503) ~[na:na]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[na:na]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[app:6.1.5]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[app:6.1.5]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[app:6.1.5]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1833) ~[app:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[app:6.1.5]
    ... 17 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>()
    at java.base@22/java.lang.Class.checkExecutable(DynamicHub.java:1101) ~[app:na]
    at java.base@22/java.lang.Class.checkConstructor(DynamicHub.java:1082) ~[app:na]
    at java.base@22/java.lang.Class.getConstructor0(DynamicHub.java:1272) ~[app:na]
    at java.base@22/java.lang.Class.getConstructor(DynamicHub.java:2452) ~[app:na]
    at java.base@22/java.util.ServiceLoader$1.run(ServiceLoader.java:662) ~[na:na]
    at java.base@22/java.util.ServiceLoader$1.run(ServiceLoader.java:659) ~[na:na]
    at java.base@22/java.security.AccessController.executePrivileged(AccessController.java:113) ~[app:na]
    at java.base@22/java.security.AccessController.doPrivileged(AccessController.java:571) ~[app:na]
    at java.base@22/java.util.ServiceLoader.getConstructor(ServiceLoader.java:670) ~[app:na]
    ... 43 common frames omitted



I've tried to mess with the pom file, use different plugins and dependencies, but of no avail.

The command I use to build the image is:

mvn -Pnative native:compile

This is my pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.library</groupId>
    <artifactId>app</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>app</name>
    <description>GraalVM Student Project</description>
    <properties>
        <java.version>22</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>net.bytebuddy</groupId>
                    <artifactId>byte-buddy</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy</artifactId>
            <version>1.14.13</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.hibernate.orm.tooling</groupId>
                <artifactId>hibernate-enhance-maven-plugin</artifactId>
                <version>6.4.4.Final</version>
                <executions>
                    <execution>
                        <configuration>
                            <enableDirtyTracking>true</enableDirtyTracking>
                        </configuration>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

Upvotes: 4

Views: 1513

Answers (2)

Anish B.
Anish B.

Reputation: 16519

I guess I found the issue. I decompiled the code for hibernate-core 6.4.4 that comes from Spring Boot 3.2.4 version.

Interestingly, I found out that BytecodeProviderImpl class present in it supports only JDK 11.

This is the constructor which checks for VM from JDK 11:

public BytecodeProviderImpl() {
   this(ClassFileVersion.ofThisVm(ClassFileVersion.JAVA_V11));
}

The fact that you are trying to execute the code using JDK 22 that I can see from logs.

That's why the code is unable to compile giving this absurd error.

I will suggest to check whether or not downgrading JDK 22 to 11 works for you.

Upvotes: 0

khrabar
khrabar

Reputation: 51

Was able to solve it myself, although not in the way I originally imagined.

https://github.com/spring-projects/spring-boot/issues/39744

Apparently, there is an issue with Hibernate and it needs to be downgraded to at least 6.4.2 (the current version is 6.5.0.CR1) in the properties section of the POM.xml.

Upvotes: 1

Related Questions