Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4.1.0] Hibernate Native image won't run with PostgreSQL #9136

Open
lprimak opened this issue Aug 13, 2024 · 11 comments · May be fixed by #9393
Open

[4.1.0] Hibernate Native image won't run with PostgreSQL #9136

lprimak opened this issue Aug 13, 2024 · 11 comments · May be fixed by #9393
Assignees
Labels
4.x Version 4.x bug Something isn't working native-image P3

Comments

@lprimak
Copy link

lprimak commented Aug 13, 2024

Environment Details

  • Helidon Version: 4.1.0,4.1.2
  • Helidon MP
  • JDK version: 21.0.2-graalce
  • OS: Mac

Problem Description

Modified database-mp sample to use Postgres instead of H2
However, when running the resulting image, there seem to be missing reflection hints:

./target/helidon-greeter-1.x-SNAPSHOT
Exception in thread "main" org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.dialect.PostgreSQLInetJdbcType]
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:126)
	at org.hibernate.dialect.PgJdbcHelper.createJdbcType(PgJdbcHelper.java:60)
	at org.hibernate.dialect.PgJdbcHelper.getInetJdbcType(PgJdbcHelper.java:46)
	at org.hibernate.dialect.PostgreSQLDialect.contributePostgreSQLTypes(PostgreSQLDialect.java:1395)
	at org.hibernate.dialect.PostgreSQLDialect.contributeTypes(PostgreSQLDialect.java:1368)
	at org.hibernate.dialect.Dialect.contribute(Dialect.java:1589)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:630)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:174)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1432)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503)
	at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:142)
	at io.helidon.integrations.cdi.jpa.PersistenceExtension.produceEntityManagerFactory(PersistenceExtension.java:1458)
	at org.jboss.weld.bootstrap.events.configurator.BeanConfiguratorImpl$CreateCallback.create(BeanConfiguratorImpl.java:372)
	at org.jboss.weld.bootstrap.events.configurator.BeanConfiguratorImpl$ImmutableBean.create(BeanConfiguratorImpl.java:511)
	at org.jboss.weld.contexts.AbstractContext.get(AbstractContext.java:96)
	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100)
	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:679)
	at org.jboss.weld.bean.builtin.InstanceImpl.getBeanInstance(InstanceImpl.java:262)
	at org.jboss.weld.bean.builtin.InstanceImpl$InstanceImplIterator.next(InstanceImpl.java:335)
	at io.helidon.integrations.cdi.jpa.PersistenceExtension.workAroundWeldBeanMetadataCreationBug(PersistenceExtension.java:661)
	at [email protected]/java.lang.reflect.Method.invoke(Method.java:580)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:95)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:85)
	at org.jboss.weld.injection.MethodInvocationStrategy$DefaultMethodInvocationStrategy.invoke(MethodInvocationStrategy.java:144)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330)
	at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:126)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:308)
	at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286)
	at jakarta.enterprise.inject.spi.ObserverMethod.notify(ObserverMethod.java:142)
	at org.jboss.weld.util.Observers.notify(Observers.java:166)
	at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:285)
	at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:273)
	at org.jboss.weld.event.EventImpl.fire(EventImpl.java:96)
	at io.helidon.microprofile.cdi.HelidonContainerImpl.doStart(HelidonContainerImpl.java:311)
	at io.helidon.common.context.Contexts.runInContext(Contexts.java:137)
	at io.helidon.microprofile.cdi.HelidonContainerImpl.start(HelidonContainerImpl.java:258)
	at io.helidon.microprofile.cdi.Main.main(Main.java:80)
	at com.flowlogix.example.HelloEntryPoint.main(HelloEntryPoint.java:36)
	at [email protected]/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
Caused by: java.lang.ClassNotFoundException: org.hibernate.dialect.PostgreSQLInetJdbcType
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:122)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:86)
	at [email protected]/java.lang.Class.forName(DynamicHub.java:1356)
	at [email protected]/java.lang.Class.forName(DynamicHub.java:1345)
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:123)
	... 39 more

Steps to reproduce

@lprimak
Copy link
Author

lprimak commented Aug 13, 2024

@tvallin another one for you :)

@m0mus m0mus added bug Something isn't working P3 native-image 4.x Version 4.x labels Aug 15, 2024
@tomas-langer
Copy link
Member

In Helidon, this would be in:
integrations/db/pgsql/src/main/resources/META-INF/helidon/native-image/reflection-config.json

Also you can work-around this problem by adding the file src/main/resources/META-INF/helidon/native-image/reflection-config.json into your own project, and adding the org.hibernate.dialect.PostgreSQLInetJdbcType, such as:

{
    "classes": [
        "org.hibernate.dialect.PostgreSQLInetJdbcType",
    ]
}

@lprimak
Copy link
Author

lprimak commented Aug 15, 2024

There are far more classes that are missing
Started to add them one by one and got tired pretty quick :)

@lprimak
Copy link
Author

lprimak commented Aug 15, 2024

Is there any way to figure out which classes are missing all at once instead of one-by-one?
Since Graal compilation is so slow, it takes forever figuring out the configuration files...

@lprimak
Copy link
Author

lprimak commented Oct 11, 2024

@tomas-langer @tvallin is there an "easy"/fast way to figure out configuration?

@lprimak
Copy link
Author

lprimak commented Oct 11, 2024

Tried https:/tvallin/helidon/tree/4.x-native-image-hibernate
However, got the following error.
Not sure how / if that relates, but I can't get passed this...

[WARNING] [stderr] Error: Classes that should be initialized at run time got initialized during image building:
[WARNING] [stderr]  org.eclipse.yasson.internal.JsonbContext was unintentionally initialized at build time. To see why org.eclipse.yasson.internal.JsonbContext got initialized use --trace-class-initialization=org.eclipse.yasson.internal.JsonbContext
[WARNING] [stderr] To see how the classes got initialized, use --trace-class-initialization=org.eclipse.yasson.internal.JsonbContext

@lprimak
Copy link
Author

lprimak commented Oct 11, 2024

More info:

[WARNING] [stderr] Error: Classes that should be initialized at run time got initialized during image building:
[WARNING] [stderr]  org.eclipse.yasson.internal.JsonbContext was unintentionally initialized at build time. org.hibernate.type.format.jakartajson.JakartaJsonIntegration caused initialization of this class with the following trace: 
[WARNING] [stderr] 	at org.eclipse.yasson.internal.JsonbContext.<clinit>(JsonbContext.java:45)
[WARNING] [stderr] 	at org.eclipse.yasson.internal.JsonBinding.<init>(JsonBinding.java:45)
[WARNING] [stderr] 	at org.eclipse.yasson.internal.JsonBindingBuilder.build(JsonBindingBuilder.java:61)
[WARNING] [stderr] 	at jakarta.json.bind.JsonbBuilder.create(JsonbBuilder.java:86)
[WARNING] [stderr] 	at org.hibernate.type.format.jakartajson.JsonBJsonFormatMapper.<init>(JsonBJsonFormatMapper.java:27)
[WARNING] [stderr] 	at org.hibernate.type.format.jakartajson.JakartaJsonIntegration.<clinit>(JakartaJsonIntegration.java:16)
[WARNING] [stderr] 
[WARNING] [stderr] 

@lprimak
Copy link
Author

lprimak commented Oct 11, 2024

Reproducer: https:/flowlogix/native-java
Run with mvn package -Phelidon-jpa,native

@lprimak
Copy link
Author

lprimak commented Oct 11, 2024

Ok, got passed it by adding --initialize-at-build-time=org.eclipse.yasson.internal and project compiled!
However, now getting an exception at runtime:

Exception in thread "main" java.lang.IllegalArgumentException: Class org.jboss.jandex.ClassInfo[] is instantiated reflectively but was never registered.Register the class by adding "unsafeAllocated" for the class in reflect-config.json.
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.graal.snippets.SubstrateAllocationSnippets.arrayHubErrorStub(SubstrateAllocationSnippets.java:351)
	at org.jboss.jandex.Utils.lambda$unfold$0(Utils.java:58)
	at [email protected]/java.util.HashMap.forEach(HashMap.java:1429)
	at org.jboss.jandex.Utils.unfold(Utils.java:57)
	at org.jboss.jandex.Index.create(Index.java:186)
	at org.jboss.jandex.Indexer.complete(Indexer.java:2658)
	at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor(ClassFileArchiveEntryHandler.java:66)
	at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:54)
	at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:147)
	at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:48)
	at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:149)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:296)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:198)
	at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:35)
	at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:102)
	at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:169)
	at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:142)
	at io.helidon.integrations.cdi.jpa.PersistenceExtension.produceEntityManagerFactory(PersistenceExtension.java:1458)
	at org.jboss.weld.bootstrap.events.configurator.BeanConfiguratorImpl$CreateCallback.create(BeanConfiguratorImpl.java:383)
	at org.jboss.weld.bootstrap.events.configurator.BeanConfiguratorImpl$CreateCallback.access$700(BeanConfiguratorImpl.java:350)
	at org.jboss.weld.bootstrap.events.configurator.BeanConfiguratorImpl$ImmutableBean.create(BeanConfiguratorImpl.java:522)
	at org.jboss.weld.contexts.AbstractContext.get(AbstractContext.java:96)
	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:106)
	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:706)
	at org.jboss.weld.bean.builtin.InstanceImpl.getBeanInstance(InstanceImpl.java:267)
	at org.jboss.weld.bean.builtin.InstanceImpl.access$200(InstanceImpl.java:73)
	at org.jboss.weld.bean.builtin.InstanceImpl$InstanceImplIterator.next(InstanceImpl.java:340)
	at io.helidon.integrations.cdi.jpa.PersistenceExtension.workAroundWeldBeanMetadataCreationBug(PersistenceExtension.java:661)
	at [email protected]/java.lang.reflect.Method.invoke(Method.java:580)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:99)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:88)
	at org.jboss.weld.injection.MethodInvocationStrategy$DefaultMethodInvocationStrategy.invoke(MethodInvocationStrategy.java:153)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:350)
	at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:136)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:328)
	at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:298)
	at jakarta.enterprise.inject.spi.ObserverMethod.notify(ObserverMethod.java:142)
	at org.jboss.weld.util.Observers.notify(Observers.java:176)
	at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:307)
	at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:293)
	at org.jboss.weld.event.EventImpl.fire(EventImpl.java:96)
	at io.helidon.microprofile.cdi.HelidonContainerImpl.doStart(HelidonContainerImpl.java:311)
	at io.helidon.common.context.Contexts.runInContext(Contexts.java:137)
	at io.helidon.microprofile.cdi.HelidonContainerImpl.start(HelidonContainerImpl.java:258)
	at io.helidon.microprofile.cdi.Main.main(Main.java:80)
	at com.flowlogix.example.HelloEntryPoint.main(HelloEntryPoint.java:36)
	at [email protected]/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)

@tvallin
Copy link
Member

tvallin commented Oct 14, 2024

To fix this, add a reflect-config.json under com/flowlogix/native/helidon-greeter with this content:

[
  {
    "name": "org.jboss.jandex.ClassInfo[]",
    "unsafeAllocated": true
  }
]

@lprimak
Copy link
Author

lprimak commented Oct 14, 2024

Thanks @tvallin !!!
That change made the program run.
I am guessing this change should be integrated into hibernate-cdi integration module as well?

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
4.x Version 4.x bug Something isn't working native-image P3
Projects
Status: Sprint Scope
Development

Successfully merging a pull request may close this issue.

4 participants