使用GraalVM编译Hibernate遇运行时错误,求解决方案
Hibernate 结合 GraalVM 原生编译运行故障排查
我的项目依赖Hibernate,尝试用GraalVM编译时过程顺利,但运行时报错:
2023-10-26 | 19:13:52.154 [ main] ←[34mINFO ←[0;39m | ←[36m org.hibernate.Version←[0;39m | HHH000412: Hibernate ORM core version 5.6.14.Final Exception in thread "main" com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime. at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:121) at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.PredefinedClassesSupport.throwNoBytecodeClasses(PredefinedClassesSupport.java:76) at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.PredefinedClassesSupport.loadClass(PredefinedClassesSupport.java:130) at java.base@21.0.1/java.lang.ClassLoader.defineClass(ClassLoader.java:280) at net.bytebuddy.utility.dispatcher.JavaDispatcher$DynamicClassLoader.invoker(JavaDispatcher.java:1383) at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:459) at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:452)
已尝试的解决方案
- 将Hibernate版本升级至GraalVM兼容列表中的版本,使用native-agent捕获所需代理类,但未成功
- 了解到Quarkus框架对GraalVM有优化,但不在我的考虑范围内
- 改用
hibernate-entitymanager:5.4.10版本,每次编译都用native-agent收集配置文件,仍报错:
Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:305)
更新进展
- 已将所有依赖升级至当前最新版Hibernate(因过时Criteria用法耗费不少精力,最终成功适配),但Hibernate的传递依赖ByteBuddy仍阻碍原生编译进程
- 尝试启用实验特性
experimental-class-define-support获取预定义类的必要信息,并通过-H:PredefinedClassesConfigurationFiles配置,仍出现如下错误:
Caused by: java.lang.UnsupportedOperationException: Defining new classes at runtime is not supported at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unimplemented(VMError.java:195) at java.base@21.0.1/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:45) at java.base@21.0.1/java.lang.reflect.Method.invoke(Method.java:580) at net.bytebuddy.utility.Invoker$Dispatcher.invoke(Unknown Source) at net.bytebuddy.utility.dispatcher.JavaDispatcher$Dispatcher$ForNonStaticMethod.invoke(JavaDispatcher.java:1032) at net.bytebuddy.utility.dispatcher.JavaDispatcher$ProxiedInvocationHandler.invoke(JavaDispatcher.java:1162) at jdk.proxy4/jdk.proxy4.$Proxy63.defineClass(Unknown Source) at net.bytebuddy.dynamic.loading.ClassInjector$UsingLookup.injectRaw(ClassInjector.java:1638) ... 36 more
提问
是否有人实现过Hibernate结合ByteBuddy通过GraalVM原生编译并正常运行的案例?我已提供复现示例仓库。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

