How to configure Ebean agent enhancements?

398 views
Skip to first unread message

Daniel Stoch

unread,
Oct 1, 2022, 7:02:46 AM10/1/22
to Ebean ORM
Hi,

I am migrating from very old version of Ebean 2.8.1 which stops work in Java 11 to the newest version 13.9.3. The previous version does not need enhancer to work. The new one requires it and I have some problems with configuration and I didn't find a sufficient info in documentation.

For now I'm trying to run application in Eclipse and I configured javaagent as described in doc. I have two problems:

1. How to configure enhancer to enhance only specific class (or packages)? For now it seems that it tries to enhance many other classes (everything?!) and it causes errors like:
ebean-enhance> cls: com/sample/SomeClass  msg: defaulted common supertype for type1:com/otherpackage/AnotherClassl type2:java/lang/Object due to err:java.lang.IllegalArgumentException: java.io.IOException: Class not found

I found some info about configuration in "ebean.mf" (but no in documentation) and trying to add such file to META-INF, but it does not changed anything.

2. For classes which define entities I receive exceptions:

Error in deployment
java.lang.IllegalStateException: Error trying to create the prototypeEntityBean for class com.myapp.entities.SomeEntity
    at io.ebeaninternal.server.deploy.BeanDescriptor.createPrototypeEntityBean(BeanDescriptor.java:432)
    at io.ebeaninternal.server.deploy.BeanDescriptor.<init>(BeanDescriptor.java:247)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.registerDescriptor(BeanDescriptorManager.java:621)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityRelationships(BeanDescriptorManager.java:736)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:296)
    at io.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:129)
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:104)
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:29)
    at io.ebean.DatabaseFactory.createInternal(DatabaseFactory.java:136)
    at io.ebean.DatabaseFactory.create(DatabaseFactory.java:85)
...
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at io.ebeaninternal.server.deploy.BeanDescriptor.createPrototypeEntityBean(BeanDescriptor.java:430)
    ... 41 more
Caused by: java.lang.InstantiationError: io.ebean.bean.EntityBeanIntercept
    at com.myapp.entities.SomeEntity.<init>(SomeEntity.java:67)
   
Any help and clarification appreciated :).

--
Regards,
Daniel

Szabolcs Hubai

unread,
Oct 1, 2022, 5:41:55 PM10/1/22
to Ebean ORM
Hi Daniel,

On Saturday, October 1, 2022 at 1:02:46 PM UTC+2 Daniel Stoch wrote:
Hi,

I am migrating from very old version of Ebean 2.8.1 which stops work in Java 11 ...

Just an interesting note: I was able to run a sample application with Ebean 2.7.4 on Java 11 after adding "javax.xml.bind:jaxb-api" to dependencies:
INFO: Ebean Version[2.7.4] Java Version[11.0.16]

Without that dependency I got the following in the log:
23:07:59,832 ERROR ~ Failed to create ebean server (javax/xml/bind/annotation/XmlRootElement)


But for my real application I got java.lang.ArrayIndexOutOfBoundsException:

java.lang.ArrayIndexOutOfBoundsException: Index 35824 out of bounds for length 30236
    at com.avaje.ebean.enhance.asm.ClassReader.<init>(ClassReader.java:174)
    at com.avaje.ebean.enhance.asm.ClassReader.<init>(ClassReader.java:153)
    at com.avaje.ebean.enhance.agent.Transformer.detect(Transformer.java:238)
    at com.avaje.ebean.enhance.agent.Transformer.transform(Transformer.java:94)
    at play.modules.ebean.EbeanEnhancer.enhanceThisClass(EbeanEnhancer.java:28)
    at play.modules.ebean.EbeanPlugin.enhance(EbeanPlugin.java:152)
    at play.plugins.PluginCollection.enhance(PluginCollection.java:638)
    at play.classloading.ApplicationClasses$ApplicationClass.enhance(ApplicationClasses.java:267)
    at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:173)
    at play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:443)
    at play.Play.preCompile(Play.java:631)
    at play.Play.init(Play.java:324)
    at play.server.Server.main(Server.java:162)


So I have to walk through that Ebean upgrade way too! :)


2. For classes which define entities I receive exceptions:

Error in deployment
java.lang.IllegalStateException: Error trying to create the prototypeEntityBean for class com.myapp.entities.SomeEntity
    at io.ebeaninternal.server.deploy.BeanDescriptor.createPrototypeEntityBean(BeanDescriptor.java:432)
    at io.ebeaninternal.server.deploy.BeanDescriptor.<init>(BeanDescriptor.java:247)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.registerDescriptor(BeanDescriptorManager.java:621)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityRelationships(BeanDescriptorManager.java:736)
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:296)
    at io.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:129)
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:104)
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:29)
    at io.ebean.DatabaseFactory.createInternal(DatabaseFactory.java:136)
    at io.ebean.DatabaseFactory.create(DatabaseFactory.java:85)
...
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at io.ebeaninternal.server.deploy.BeanDescriptor.createPrototypeEntityBean(BeanDescriptor.java:430)
    ... 41 more
Caused by: java.lang.InstantiationError: io.ebean.bean.EntityBeanIntercept
    at com.myapp.entities.SomeEntity.<init>(SomeEntity.java:67)
   

This trace is very similar to the one in my thread. Rob answered that in detail in ebean-orm/ebean#2689.


Cheers,
Szabolcs

Daniel Stoch

unread,
Oct 3, 2022, 9:31:53 AM10/3/22
to Ebean ORM
Hi Szabolcs,

Thanks for your answer.

For Ebean 2.8.1 on Java 11 I have the ClassFormatError:

...
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.avaje.ebean.EbeanServer]: Factory method 'sampleEbeanServer' threw exception; nested exception is javax.persistence.PersistenceException: Error creating subclass for [com.company.domain.SomeEntity]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
    ... 19 more
Caused by: javax.persistence.PersistenceException: Error creating subclass for [com.company.domain.SomeEntity]
    at com.avaje.ebeaninternal.server.subclass.SubClassManager.createClass(SubClassManager.java:117)
    at com.avaje.ebeaninternal.server.subclass.SubClassManager.resolve(SubClassManager.java:100)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.checkSubclass(BeanDescriptorManager.java:1522)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.setEntityBeanClass(BeanDescriptorManager.java:1469)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.createByteCode(BeanDescriptorManager.java:1157)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1077)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentAssociations(BeanDescriptorManager.java:584)
    at com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:271)
    at com.avaje.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:143)
    at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:209)
    at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:63)
    at com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:78)
    ...
    ... 20 more
Caused by: java.lang.RuntimeException: java.lang.ClassFormatError: Nest member class_info_index 322 has bad constant type in class file com/company/domain/SomeEntity$$EntityBean$h2
    at com.avaje.ebeaninternal.server.subclass.SubClassFactory.create(SubClassFactory.java:96)
    at com.avaje.ebeaninternal.server.subclass.SubClassManager.createClass(SubClassManager.java:113)
    ... 42 more
Caused by: java.lang.ClassFormatError: Nest member class_info_index 322 has bad constant type in class file com/company/domain/SomeEntity$$EntityBean$h2
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:878)
    at com.avaje.ebeaninternal.server.subclass.SubClassFactory.create(SubClassFactory.java:85)
    ... 43 more



2. For classes which define entities I receive exceptions:

Caused by: java.lang.InstantiationError: io.ebean.bean.EntityBeanIntercept
    at com.myapp.entities.SomeEntity.<init>(SomeEntity.java:67)
   
This trace is very similar to the one in my thread. Rob answered that in detail in ebean-orm/ebean#2689.


I haven't found a solution yet. It doesn't work for me, maybe because of multi-module environment (OSGi).
 

Cheers,
Szabolcs


--
Regards,
Daniel
 
Reply all
Reply to author
Forward
0 new messages