Java软件报表软件技术博客

java报表软件技术汇总 java报表软件制作 报表软件新闻
posts - 355, comments - 100, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理
 

FineReport是一款国产的纯Java报表软件,其基本原理是通过ReportServer这样一个Servlet来处理所有的报表请求,并动态的生成基于Web2.0技术的HTML页面。我们在最近一期的项目中采用了FineReport作为报表引擎,在Tomcat的环境中测试顺利通过。

 

当我们把项目部署到WebSphere6.0.0.1上时,问题开始频繁出现。由于以前有过在WAS上部署项目的经验,这可能又是IBMJDK的问题。WAS6.0采用的是IBMJRE 1.4.2,由于IBMJRE的重新实现,增加了更多的功能和更加严格的运行时检查,使得在SUN JDK下编译的应用程序,多多少少会出现一些问题。

 

出现的第一个问题是:sun.io.malformedinputexception异常。Google上找到了一些解决方案:

·         http://www.blogjava.net/mlw2000/archive/2007/03/01/101282.aspx

·         http://blog.csdn.net/CharlesYY/archive/2006/11/10/1377774.aspx

根据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.        ClassLoaderCLASS_PATH中找不到class的定义;

3.        要加载的class处于当前ClassLoader的子层次上。按照WAS类加载器的层次式设计,低层的Class可以访问高层的Class,反之不行。

我们顺着这个线索摸下去,很快就发现了问题的所在。第一个错误是因为FineReportClass中调用某个XWindowAPI,由于某种原因调用失败,从而导致后来的ClassDefNotFound错误。第二个错误是由于我把FineReportSpring等公共类全部都放到公共路径/opt/lib下,并设置成WAS的共享库。由于FineReport在运行时需要调用Application的内部类,从而根据3的原因错误产生了。

于是我和老薛又讨论,得知FineReport中查找类的方法是Class.forName。如果把FineReport放在/WEB-INF/lib下,Class.forName调用的ClassLoader自然可以找到当前上下文中的类。可是当FineReport处在/opt/lib的较高层次的类路径上时,寻找下级的某个类,问题出现了。问题集中在一点上:如何在共享库中找到应用程序中类。

我一直用Spring框架,Spring通过配置文件动态的加载类,这种情况和我们现在遇到的问题完全相同。但Spring是如何解决的呢?看来得深入Spring的代码好好研究研究了。

文章转自:http://blog.sina.com.cn/s/blog_44f68c96010008pi.html




只有注册用户登录后才能发表评论。


网站导航: