apache / ignite

Apache Ignite
https://ignite.apache.org/
Apache License 2.0
4.7k stars 1.88k forks source link

Ignite 2.16 is incompatible with recent h2database, h2 must be shaded #11333

Open magicprinc opened 2 weeks ago

magicprinc commented 2 weeks ago

With com.h2database:h2:2.2.224 I receive:

java.lang.NoClassDefFoundError: org/h2/value/ValueByte

    at org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory.registerAll(GridH2ValueMessageFactory.java:40)
    at org.apache.ignite.internal.managers.communication.IgniteMessageFactoryImpl.<init>(IgniteMessageFactoryImpl.java:72)
    at org.apache.ignite.internal.managers.communication.GridIoManager.start(GridIoManager.java:482)
    at org.apache.ignite.internal.IgniteKernal.startManager(IgniteKernal.java:1774)
    at org.apache.ignite.internal.IgniteKernal.start(IgniteKernal.java:1008)
    at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start0(IgnitionEx.java:1725)
    at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start(IgnitionEx.java:1647)
    at org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1089)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:625)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:547)
    at org.apache.ignite.Ignition.start(Ignition.java:300)
    at ignite.ExpireTest.expireListener(ExpireTest.java:32)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.lang.ClassNotFoundException: org.h2.value.ValueByte
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
    ... 15 more

The last compatible version of h2 is 1.4.197 → Mar 18, 2018 with a lot of vulnerabilities!

The h2 database must be either:

I use Gradle and don't know Maven, but it should probably look close to this:

https://github.com/magicprinc/ignite/commit/a185f1eba68eee548f42e8b1198d8fff572b0c2d

(see also https://github.com/apache/ignite/pull/9336)

See also https://github.com/gridgain/gridgain/tree/master/modules/h2

nao-it commented 1 week ago

@magicprinc New versions of the h2 engine will not work with Apache Ignite, you can use the Calcite engine if these vulnerabilities are critical for you https://ignite.apache.org/docs/latest/SQL/sql-calcite#calcite-module-libraries

magicprinc commented 1 week ago

@nao-it No, I have another problem. I use some library, which depends on new h2. So, thers is a conflict between new h2 and Ignite's h2. The good solution is shading. GridGain Community has shaded h2 ⇒ no public dependency, all classes bundled with different package name.

More theory on the topic "shading" (maven plugin is also available) https://imperceptiblethoughts.com/shadow/introduction/