org.apache.ignite.IgniteCheckedException: Failed to find class with given class loader

项目在本地启动的时候正常运行,但是打包后上传到服务器上执行时报错:
Caused by: org.apache.ignite.IgniteCheckedException: Failed to find class with given class loader for unmarshalling (make sure same versions of all classes are available on all nodes or enable peer-class-loading) [clsLdr=sun.misc.Launcher$ExtClassLoader@1329eff, cls=com.xxx.IgniteTestService]
at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:129)
at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:139)
at org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:80)
at org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10376)
at org.apache.ignite.internal.processors.cache.GridCacheProcessor$7.applyx(GridCacheProcessor.java:4949)
... 65 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.xxx.IgniteTestService
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8900)
at org.apache.ignite.marshaller.jdk.JdkMarshallerObjectInputStream.resolveClass(JdkMarshallerObjectInputStream.java:59)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:124)
... 69 common frames omitted
原因分析:

  • 本地启动的时候类加载器是AppClassLoader,但是在服务器上使用了ExtClassLoader。
  • 服务器上的部署采用了jar包与依赖包分离的方式,运行的时候通过 -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:lib 的方式指定依赖包,所以ignite通过
    IgniteUtils.class.getClassLoader() 获取的类加载器就成了ExtClassLoader

解决办法:

  1. ignite的配置指定类加载器
  IgniteConfiguration cfg = new IgniteConfiguration();
  cfg.setClassLoader(Thread.currentThread().getContextClassLoader());
  1. 运行的时候通过 -Dloader.path=lib 方式指定依赖包
posted @ 2022-07-14 10:33  天道酬勤1112  阅读(409)  评论(0)    收藏  举报