NoClassDefFoundExceptions on Java 11 with OSGi

62 views
Skip to first unread message

Matthew Piggott

unread,
Nov 30, 2023, 11:09:11 AM11/30/23
to mybatis-user
Hi,

We're using MyBatis in an OSGi runtime (karaf with felix) which works on Java 8. However if we use the same binary on Java 11 we experience NoClassDefFoundExceptions when classes are enhanced.

Initially this is for WriteReplaceInterface which can be avoided by adding an Import-Package to the bundle with the class being enhanced. However unfortunately this simply exposes another exception for org.apache.ibatis.javassist.util.proxy.ProxyObject and that package cannot be imported as mybatis does not export it.

Are there any recommendations we ought to be following when using OSGi?

Suppressed: java.lang.NoClassDefFoundError: org/apache/ibatis/executor/loader/WriteReplaceInterface
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.System$2.defineClass(System.java:2144)
        at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:962)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:295)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:48)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
        at org.apache.ibatis.javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:154)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:640)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:624)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:560)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:481)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.create(ProxyFactory.java:828)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.createStaticProxy(JavassistProxyFactory.java:93)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl.createProxy(JavassistProxyFactory.java:127)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.createProxy(JavassistProxyFactory.java:61)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:665)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:411)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:366)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:337)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)
        at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)
        at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
        at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
        at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
        at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90)
        at org.sonatype.nexus.datastore.mybatis.EntityExecutor.lambda$2(EntityExecutor.java:111)
        at org.sonatype.nexus.datastore.mybatis.EntityExecutor.call(EntityExecutor.java:200)
        at org.sonatype.nexus.datastore.mybatis.EntityExecutor.query(EntityExecutor.java:111)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
        at org.sonatype.nexus.datastore.mybatis.DataAccessSqlSession.selectList(DataAccessSqlSession.java:73)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
        at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
        ... 16 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.apache.ibatis.executor.loader.WriteReplaceInterface
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:594)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
        at org.apache.felix.framework.BundleWiringImpl.doImplicitBootDelegation(BundleWiringImpl.java:1785)
        at org.apache.felix.framework.BundleWiringImpl.tryImplicitBootDelegation(BundleWiringImpl.java:1714)
        at org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1667)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1543)
        at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:78)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1950)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
        ... 70 common frames omitted



Suppressed: java.lang.NoClassDefFoundError: org/apache/ibatis/javassist/util/proxy/ProxyObject
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.System$2.defineClass(System.java:2144)
        at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:962)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:295)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:48)
        at org.apache.ibatis.javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
        at org.apache.ibatis.javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:154)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:640)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:624)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:560)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:481)
        at org.apache.ibatis.javassist.util.proxy.ProxyFactory.create(ProxyFactory.java:828)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.createStaticProxy(JavassistProxyFactory.java:93)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl.createProxy(JavassistProxyFactory.java:127)
        at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.createProxy(JavassistProxyFactory.java:61)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:665)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:411)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:366)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:337)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310)
        at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)
        at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)
        at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
        at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
        at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
        at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90)
        at org.sonatype.nexus.datastore.mybatis.EntityExecutor.query(EntityExecutor.java:107)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
        at org.sonatype.nexus.datastore.mybatis.DataAccessSqlSession.selectList(DataAccessSqlSession.java:73)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
        at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
        ... 16 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.apache.ibatis.javassist.util.proxy.ProxyObject
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:594)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
        at org.apache.felix.framework.BundleWiringImpl.doImplicitBootDelegation(BundleWiringImpl.java:1785)
        at org.apache.felix.framework.BundleWiringImpl.tryImplicitBootDelegation(BundleWiringImpl.java:1714)
        at org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1667)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1543)
        at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:78)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1950)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
        ... 68 common frames omitted


Jeremy Landis

unread,
Dec 1, 2023, 2:00:23 PM12/1/23
to mybatis-user
Hi Matthew,

If you could, please go open this ticket over on mybatis-3 core and work with me to figure this issue out.  I'm switching from maven bundle plugin to bnd-maven-plugin basically now and will want you to test out if that makes any differences then we can go from there.  We have osgi basically built into our parent pom for years and its not changed much in my time and I don't use OSGI to know much about it.  For javassist we are shading that but personally I think we should not be doing such things these days.  At any rate, unlike normal go to user group, please take discussion over to an issue at the core here https://github.com/mybatis/mybatis-3/issues.  Regardless if this is an user related issue or simply something we have wrong for a long time, it will be greatly beneficial to have an osgi user help confirm our transition of the plugin and fix up any loose ends.

Thanks,

Jeremy

Matthew Piggott

unread,
Dec 1, 2023, 2:50:28 PM12/1/23
to mybati...@googlegroups.com
Hi Jeremy,

Sure, I'd actually started on Github but saw the link in the template. I've opened the following on github: https://github.com/mybatis/mybatis-3/issues/3028

I would expect (!) that I should be able to build mybatis locally if needed to help with testing.

Thanks

--
You received this message because you are subscribed to a topic in the Google Groups "mybatis-user" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/mybatis-user/bDqkd3b7M6A/unsubscribe.
To unsubscribe from this group and all its topics, send an email to mybatis-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/mybatis-user/371be5c9-0ed3-476b-9fda-dcc341a8e498n%40googlegroups.com.


--

Matthew Piggott

Senior Software Engineer

Sigstrlogo2x1657561912.png

Read the guide that defines rapidly changing open source.

Reply all
Reply to author
Forward
0 new messages