伺服器(WAS)部署時,有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況,其中相當一部分錯誤是因為類載入的問題.有一次接到用戶電話,反映使用JSF開發的應用,在WAS上不能正常運行.到用戶現場,發現開"/> 伺服器(WAS)部署時,有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況,其中相當一部分錯誤是因為類載入的問題.有一次接到用戶電話,反映使用JSF開發的應用,在WAS上不能正常運行.到用戶現場,發現開"/>
1.先嘗試更改應用的類載入路徑:
WAS的類載入原理請參見後面列出的參考資料.
如果是xxx.war應用,在部署到WAS后,登陸WAS管理控制台,選擇應用程序/xxx_war應用,選擇「管理模塊」,選擇相應的.war模塊,默認的類裝入器順序為「類已裝入並且是先使用父類裝入器」,更改「類裝入器順序」為「類已裝入並且是先使用應用程序類裝入器」.
如下圖:
如果安裝的應用是xxx.ear應用,特別是有一些公用的utility jar位於ear級別,則除了按照上面步驟更改war模塊(也稱為web模塊)的類裝入器順序之外,還要更改ear級別的類裝入器順序:選擇應用程序/xxx應用,選擇「類裝入和更新檢測」,選擇「類已裝入並且是先使用應用程序類裝入器」如下圖:
重啟應用,必要時重啟WAS,測試頁面是否正常顯示.
2.如果還是不能正常顯示,則查看應用特別是開源項目使用的utility jar包,通常位於ear目錄級別,或者xxx.war/WEB-INF/lib目錄下,刪除掉一些常見的WAS已有的且必須使用WAS自帶的jar包,如j2ee.jar,支持JSP等運行的jar等(此類問題SystemOut.log或者SystemErr.log中通常會報錯).如果自己無法判斷,則略過此步.本次錯誤診斷中,檢查客戶應用,發現WEB-INF/lib目錄中jar包數量眾多,且客戶除了使用myfaces、還有其他大量開源項目,不能明確斷定有問題的與WAS衝突的jar包.
3.到www.ibm.com/support以及google、baidu上搜索關鍵字JSF、myfaces、WebSphere,得到一些建議:
Apache Tomahawk configuration error with Apache MyFaces and WebSphere Application Server 6.0 and 6.1:
http://www-01.ibm.com/support/docview.wss?rs=0&q1=myfaces&uid=swg21291065&loc=en_US&cs=utf-8&cc=us&lang=en
Using MyFaces JSF and WebSphere Application Server V6.0 and V6.1:
http://www-01.ibm.com/support/docview.wss?rs=0&q1=myfaces&uid=swg21243668&loc=en_US&cs=utf-8&cc=us&lang=en
sitemesh、myfaces、richfaces的集成解決方案:
http://www.javaeye.com/topic/127703
按照搜到的建議操作,頁面仍無法顯示,為了分離錯誤,縮小診斷範圍,進行第4步.
4.到myfaces項目網站http://myfaces.apache.org/,下載與客戶應用同一版本的最簡單的sample應用myfaces-example-simple-1.1.9.war,在WAS上安裝進行測試,頁面無法顯示,進行第1步更改類載入路徑也無法顯示.檢查myfaces-example-simple-1.1.9.war的lib目錄,刪除掉xml-apis-1.0.b2.jar和xmlParserAPIs-2.0.2.jar包,運行成功.
5.回到客戶應用,刪除掉xml-apis-1.0.b2.jar和xmlParserAPIs-2.0.2.jar,更改類載入路徑,頁面正常顯示.
6.如果實際診斷中,能夠明確斷定是某個類的載入出了問題,可以打開「詳細類裝入」:選擇「應用程序伺服器/server1/進程定義/Java虛擬機」,選擇「詳細類裝入」如下圖:
重啟WAS之後,在native_stderr.log中,可以看到類的載入信息,例如:
如果還需要類載入的更詳細信息,可以在診斷跟蹤中設置 *=info: com.ibm.ws.classloader.*=all,具體做法為:登陸管理控制台,左邊導航樹選擇「故障診斷/日誌和跟蹤」,然後在右面區域選擇進程名(單機環境通常為server1)/診斷跟蹤,然後選擇「更改日誌詳細信息級別」,設置「*=info: com.ibm.ws.classloader.*=all」,保存.
重啟WAS.在profile_root/logs/server1/trace.log中,就可以看到類載入的詳細信息.例如:
[火星人 ] 一次WebSphere類載入問題的錯誤診斷已經有1029次圍觀