在Websphere中使用FineReport報(bào)表軟件
Posted on 2010-06-04 21:18 FineReport——報(bào)表技術(shù)領(lǐng)跑者 閱讀(274) 評論(0) 編輯 收藏 所屬分類: Java報(bào)表技術(shù)知識FineReport是一款國產(chǎn)的純Java報(bào)表軟件,其基本原理是通過ReportServer這樣一個(gè)Servlet來處理所有的報(bào)表請求,并動(dòng)態(tài)的生成基于Web2.0技術(shù)的HTML頁面。我們在最近一期的項(xiàng)目中采用了FineReport作為報(bào)表引擎,在Tomcat的環(huán)境中測試順利通過。
當(dāng)我們把項(xiàng)目部署到WebSphere
出現(xiàn)的第一個(gè)問題是:sun.io.malformedinputexception異常。Google上找到了一些解決方案:
· http://www.tkk7.com/mlw2000/archive/2007/03/01/101282.aspx
· http://blog.csdn.net/CharlesYY/archive/2006/11/10/1377774.aspx
根據(jù)SytemErr.log給出的錯(cuò)誤信息,問題出在com/web/core/js/common.js上。和FineReport的老薛在QQ上討論了好久,也初步的認(rèn)定是common.js的編碼問題。事實(shí)上,從jar包里面提取出來的common.js文件,的確是DOS編碼,而不是IBM JRE要求的UTF-8。把該問題通過UltraEdit改為UTF-8編碼,然后更新jar包,問題解決。老薛也決定把所有的文件全部用UTF8重新編碼。
問題二:ClassDefNotFound錯(cuò)誤。
在WAS的部署中,這是個(gè)最常見的問題,也是最讓人莫名其妙的問題。明明class就定義在路徑中,為什么說找不到?其實(shí),造成這個(gè)問題有很多種原因。
1. ClassLoader加載class的時(shí)候出現(xiàn)異常,以后再調(diào)用該class的時(shí)候就會(huì)出現(xiàn)ClassDefNotFound錯(cuò)誤;
2. ClassLoader在CLASS_PATH中找不到class的定義;
3. 要加載的class處于當(dāng)前ClassLoader的子層次上。按照WAS類加載器的層次式設(shè)計(jì),低層的Class可以訪問高層的Class,反之不行。
我們順著這個(gè)線索摸下去,很快就發(fā)現(xiàn)了問題的所在。第一個(gè)錯(cuò)誤是因?yàn)?/span>FineReport在Class中調(diào)用某個(gè)XWindow的API,由于某種原因調(diào)用失敗,從而導(dǎo)致后來的ClassDefNotFound錯(cuò)誤。第二個(gè)錯(cuò)誤是由于我把FineReport、Spring等公共類全部都放到公共路徑/opt/lib下,并設(shè)置成WAS的共享庫。由于FineReport在運(yùn)行時(shí)需要調(diào)用Application的內(nèi)部類,從而根據(jù)3的原因錯(cuò)誤產(chǎn)生了。
于是我和老薛又討論,得知FineReport中查找類的方法是Class.forName。如果把FineReport放在/WEB-INF/lib下,Class.forName調(diào)用的ClassLoader自然可以找到當(dāng)前上下文中的類。可是當(dāng)FineReport處在/opt/lib的較高層次的類路徑上時(shí),尋找下級的某個(gè)類,問題出現(xiàn)了。問題集中在一點(diǎn)上:如何在共享庫中找到應(yīng)用程序中類。
我一直用Spring框架,Spring通過配置文件動(dòng)態(tài)的加載類,這種情況和我們現(xiàn)在遇到的問題完全相同。但Spring是如何解決的呢?看來得深入Spring的代碼好好研究研究了。
文章轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_44f68c96010008pi.html