- http://www.blogjava.net/mlw2000/archive/2007/03/01/101282.aspx
- http://blog.youkuaiyun.com/CharlesYY/archive/2006/11/10/1377774.aspx
- ClassLoader加载class的时候出现异常,以后再调用该class的时候就会出现ClassDefNotFound错误;
- ClassLoader在CLASS_PATH中找不到class的定义;
- 要加载的class处于当前ClassLoader的子层次上。按照WAS类加载器的层次式设计,低层的Class可以访问高层的Class,反之不行。
我们顺着这个线索摸下去,很快就发现了问题的所在。第一个错误是因为FineReport在Class中调用某个XWindow的API,由于某种原因调用失败,从而导致后来的ClassDefNotFound错误。第二个错误是由于我把FineReport、Spring等公共类全部都放到公共路径/opt/lib下,并设置成WAS的共享库。由于FineReport在运行时需要调用Application的内部类,从而根据3的原因错误产生了。
于是我和老薛又讨论,得知FineReport中查找类的方法是Class.forName。如果把FineReport放在/WEB-INF/lib下,Class.forName调用的ClassLoader自然可以找到当前上下文中的类。可是当FineReport处在/opt/lib的较高层次的类路径上时,寻找下级的某个类,问题出现了。问题集中在一点上:如何在共享库中找到应用程序中类。
我一直用Spring框架,Spring通过配置文件动态的加载类,这种情况和我们现在遇到的问题完全相同。但Spring是如何解决的呢?看来得深入Spring的代码好好研究研究了。
[待续]