FineReport是一款国产的纯软件,其基本原理是通过ReportServer这样一个Servlet来处理所有的报表请求,并动态的生成基于Web2.0技术的HTML页面。我们在最近一期的项目中采用了FineReport作为引擎,在Tomcat的环境中测试顺利通过。
?
当我们把项目部署到WebSphere6.0.0.1上时,问题开始频繁出现。由于以前有过在WAS上部署项目的经验,这可能又是IBM的JDK的问题。WAS6.0采用的是IBM的JRE 1.4.2,由于IBM对JRE的重新实现,增加了更多的功能和更加严格的运行时检查,使得在SUN JDK下编译的应用程序,多多少少会出现一些问题。
?
出现的{dy}个问题是:sun.io.malformedinputexception异常。Google上找到了一些解决方案:
·???????? ??
·????????
根据SytemErr.log给出的错误信息,问题出在com/web/core/js/common.js上。和FineReport的老薛在QQ上讨论了好久,也初步的认定是common.js的编码问题。事实上,从jar包里面提取出来的common.js文件,的确是DOS编码,而不是IBM JRE要求的UTF-8。把该问题通过UltraEdit改为UTF-8编码,然后更新jar包,问题解决。老薛也决定把所有的文件全部用UTF8重新编码。
?
问题二:ClassDefNotFound错误。
在WAS的部署中,这是个最常见的问题,也是最让人莫名其妙的问题。明明class就定义在路径中,为什么说找不到?其实,造成这个问题有很多种原因。
1.??????? ClassLoader加载class的时候出现异常,以后再调用该class的时候就会出现ClassDefNotFound错误;
2.??????? ClassLoader在CLASS_PATH中找不到class的定义;
3.??????? 要加载的class处于当前ClassLoader的子层次上。按照WAS类加载器的层次式设计,低层的Class可以访问高层的Class,反之不行。
我们顺着这个线索摸下去,很快就发现了问题的所在。{dy}个错误是因为FineReport在Class中调用某个XWindow的API,由于某种原因调用失败,从而导致后来的ClassDefNotFound错误。第二个错误是由于我把FineReport、Spring等公共类全部都放到公共路径/opt/lib下,并设置成WAS的共享库。由于FineReport在运行时需要调用Application的内部类,从而根据3的原因错误产生了。
于是我和老薛又讨论,得知FineReport中查找类的方法是Class.forName。如果把放在/WEB-INF/lib下,Class.forName调用的ClassLoader自然可以找到当前上下文中的类。可是当FineReport处在/opt/lib的较高层次的类路径上时,寻找下级的某个类,问题出现了。问题集中在一点上:如何在共享库中找到应用程序中类。
我一直用Spring框架,Spring通过配置文件动态的加载类,这种情况和我们现在遇到的问题xx相同。但Spring是如何解决的呢?看来得深入Spring的代码好好研究研究了。
文章转自: