伺服器(WAS)部署時,有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況,其中相當一部分錯誤是因為類載入的問題.有一次接到用戶電話,反映使用JSF開發的應用,在WAS上不能正常運行.到用戶現場,發現開"/> 伺服器(WAS)部署時,有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況,其中相當一部分錯誤是因為類載入的問題.有一次接到用戶電話,反映使用JSF開發的應用,在WAS上不能正常運行.到用戶現場,發現開"/>
歡迎您光臨本站 註冊首頁

一次WebSphere類載入問題的錯誤診斷

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
開發人員使用開源項目在Tomcat上進行開發,然後在生產環境中使用WebSphere應用伺服器 href="http://server.it168.com/" target=_blank>伺服器(WAS)部署時,有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況,其中相當一部分錯誤是因為類載入的問題.有一次接到用戶電話,反映使用JSF開發的應用,在WAS上不能正常運行.到用戶現場,發現開發人員使用myfaces開源項目在tomcat上進行開發,部署到WAS上時,頁面不能正常顯示.檢查WAS日誌SystemOut.log和SystemErr.log以及應用自身的日誌,沒有發現有意義的信息.遇到此類問題時,如果對開源項目或 應用內部運行機制不太了解,可以大致按下列思路進行錯誤診斷:

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中,可以看到類的載入信息,例如:

class load: org.apache.taglibs.standard.tlv.JstlBaseTLV from: file:/D:/Program/was61/AppServer/profiles/TestProfile/installedApps/wdanNode02Cell/myfaces-example-simple-1_1_9_war.ear/myfaces-example-simple-1.1.9.war/WEB-INF/lib/jstl-1.2.jar

如果還需要類載入的更詳細信息,可以在診斷跟蹤中設置 *=info: com.ibm.ws.classloader.*=all,具體做法為:登陸管理控制台,左邊導航樹選擇「故障診斷/日誌和跟蹤」,然後在右面區域選擇進程名(單機環境通常為server1)/診斷跟蹤,然後選擇「更改日誌詳細信息級別」,設置「*=info: com.ibm.ws.classloader.*=all」,保存.

重啟WAS.在profile_root/logs/server1/trace.log中,就可以看到類載入的詳細信息.例如:

> loadClass name=com.ibm.isclite.container.collaborator.PortletServletCollaborator


[火星人 ] 一次WebSphere類載入問題的錯誤診斷已經有1029次圍觀

http://coctec.com/docs/java/show-post-60647.html