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
解决办法:
- ignite的配置指定类加载器
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setClassLoader(Thread.currentThread().getContextClassLoader());
- 运行的时候通过
-Dloader.path=lib方式指定依赖包

浙公网安备 33010602011771号