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

时间:2014-06-12 17:40:54

标签: java jar jvm deserialization

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

在持久化之前,我们将序列化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)驻留在IBM Websphere服务器的JVM类路径中,并由ExtJarClassLoader加载。

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

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

请建议是否有其他解决方案来解决此类加载问题..通过更改Web范围应用程序服务器级别的配置或@ java代码的任何其他工作。

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

1 个答案:

答案 0 :(得分:0)

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

另请参阅JSR107缓存标准的API,该标准也需要解决此问题。可以通过CachingProvider使用特定的类加载器检索CacheManager。