Posted on 2010-06-04 21:18
FineReport——報表技術領跑者 閱讀(275)
評論(0) 編輯 收藏 所屬分類:
Java報表技術知識
FineReport是一款國產的純Java報表軟件,其基本原理是通過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下編譯的應用程序,多多少少會出現一些問題。
出現的第一個問題是: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
根據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,反之不行。
我們順著這個線索摸下去,很快就發現了問題的所在。第一個錯誤是因為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的代碼好好研究研究了。
文章轉自:http://blog.sina.com.cn/s/blog_44f68c96010008pi.html