当JVM类路径中的类尝试访问web应用程序库中可用的类时,如何克服java中的类加载问题

当JVM类路径中的类尝试访问web应用程序库中可用的类时,如何克服java中的类加载问题,java,jar,jvm,deserialization,Java,Jar,Jvm,Deserialization,我有一个新开发的缓存框架,用于我们的一个门户,它将被门户中的许多应用程序使用。当堆大小超过某个限制时,我们将缓存条目持久化到数据库中 在持久化之前,我们将序列化CachedObject,然后将其存储到数据库中 public class CachedObject implements Serializable{ private Object obj = null; public CachedObject(){ } public Cache

我有一个新开发的缓存框架,用于我们的一个门户,它将被门户中的许多应用程序使用。当堆大小超过某个限制时,我们将缓存条目持久化到数据库中

在持久化之前,我们将序列化CachedObject,然后将其存储到数据库中

public class CachedObject implements Serializable{  
    private Object obj = null;      
    public CachedObject(){      
    }
    public CachedObject(Object obj) {       
        this.obj = obj;
}
}
上面是我的CachedObject表示,obj是放入缓存的实际对象。假设obj是TestPojo.java类型,它驻留在各自应用程序的web inf/lib中。 这个TestPojo.java由应用程序类加载器加载

新开发的缓存框架jar(比如cache.jar)驻留在IBMWebSphereServer的JVM类路径中,由ExtJarClassLoader加载

我能够序列化缓存对象并完美地保存到数据库中,但当我 反序列化保存在数据库中的对象我将获得ClassNotFoundException,因为所需的TestPojo.java在JVM类路径级别没有可见性(cache.jar所在的位置,这里发生反序列化)

我知道,如果我能将cache.jar移到应用程序类加载器级别,问题就会得到解决。但是,我不能这样做,因为jvm类路径中还有其他jar使用这个cache.jar

请建议是否有其他解决方案来解决此类加载问题。。通过更改WebSphereApplicationServer级别的配置或围绕@java代码的任何其他工作


我还尝试了不同的方法,将应用程序的类加载委派模式更改为parent_first,parent_last,但我遇到了相同的反序列化问题。

缓存框架不应使用自己的类加载器进行反序列化,而应使用应用程序的类加载器。因此,对于每个应用程序,您需要跟踪要使用的类加载器


另请参见JSR107缓存标准的API,它也需要解决这个问题。CacheManager可以通过。

IBM Websphere使用特定的类加载器检索-这是您的问题。OSGi或Jigsaw将是答案。