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

NoClassDefFoundExceptions on Java 11 with OSGi #3028

Closed
mpiggott opened this issue Dec 1, 2023 · 3 comments
Closed

NoClassDefFoundExceptions on Java 11 with OSGi #3028

mpiggott opened this issue Dec 1, 2023 · 3 comments
Assignees

Comments

@mpiggott
Copy link
Contributor

mpiggott commented Dec 1, 2023

MyBatis version

3.5.14

Database vendor and version

H2 and PostgreSQL (not really important)

Test case or example project

I don't have anything simple at this time.

Steps to reproduce

We're using an OSGi runtime (Karaf with Felix) and have some classes which require enhancement. On Java 8 this works as expected.

When using Java 11 this leads to NoClassDefFoundException for WriteReplaceInterface, this can be resolved by adding
org.apache.ibatis.executor.loader to our Import-Package. Unfortunately this exposes the same exception but for
ProxyObject which is in a package not exported by MyBatis.

Expected result

No runtime errors :)

Actual result

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
@hazendaz hazendaz self-assigned this Dec 2, 2023
@hazendaz
Copy link
Member

hazendaz commented Dec 2, 2023

@mpiggott Thanks! Will get back with you as soon as I can. I did just apply our bnd change to the master here, if you want you could try using build from master or grabbing it from sonatype snapshots and see if the behaviour is the same. I expect it to be the same but that would give us a good baseline given the plugin change. Otherwise will start looking at this in a few days and see if I can make any sense out of it. Again thanks for bringing this over here.

@mpiggott
Copy link
Contributor Author

mpiggott commented Dec 4, 2023

@hazendaz I tried a local build of mybatis earlier and it appears the change hasn't fixed the issue. I had a thought though which appears to be confirmed by the mybatis build log - bnd runs in an earlier phase of the build than shade thus doesn't know about the classes that are added (probably this also explains why mybatis imports Javassist even when the jar contains a shaded version).

I may try updating osgi.export in the pom locally and see whether bnd complies even though the packages are missing.

@mpiggott
Copy link
Contributor Author

mpiggott commented Dec 5, 2023

@hazendaz I opened a PR with the change I mentioned in my previous message, in my local test adding this single package was sufficient for Java 11.

hazendaz added a commit that referenced this issue Dec 5, 2023
#3028 Add shaded javassist package to osgi.export
@mpiggott mpiggott closed this as completed Dec 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants