開發人員使用開源項目在Tomcat上進行開發
然後在生產環境中使用WebSphere應用服務器 target=_blank>服務器(WAS)部署時
有時會遇到在Tomcat上開發的應用在WAS上不能運行的情況
其中相當一部分錯誤是因為類加載的問題
有一次接到用戶電話
反映使用JSF開發的應用
在WAS上不能正常運行
到用戶現場
發現開發人員使用myfaces開源項目在tomcat上進行開發
部署到WAS上時
頁面不能正常顯示
檢查WAS日志SystemOut
log和SystemErr
log以及應用自身的日志
沒有發現有意義的信息
遇到此類問題時
如果對開源項目或 應用內部運行機制不太了解
可以大致按下列思路進行錯誤診斷
.首先先嘗試更改應用的類加載路徑
WAS的類加載原理請參見後面列出的參考資料
如果是xxxwar應用在部署到WAS後登陸WAS管理控制台選擇應用程序/xxx_war應用選擇管理模塊選擇相應的war模塊默認的類裝入器順序為類已裝入並且是先使用父類裝入器更改類裝入器順序為類已裝入並且是先使用應用程序類裝入器
如下圖
src=http://imgeducitycn/img_///jpg>
如果安裝的應用是xxxear應用特別是有一些公用的utility jar位於ear級別則除了按照上面步驟更改war模塊(也稱為web模塊)的類裝入器順序之外還要更改ear級別的類裝入器順序選擇應用程序/xxx應用選擇類裝入和更新檢測選擇類已裝入並且是先使用應用程序類裝入器如下圖
src=http://imgeducitycn/img_///jpg>
src=http://imgeducitycn/img_///jpg>
重啟應用必要時重啟WAS測試頁面是否正常顯示
.如果還是不能正常顯示則查看應用特別是開源項目使用的utility jar包通常位於ear目錄級別或者xxxwar/WEBINF/lib目錄下刪除掉一些常見的WAS已有的且必須使用WAS自帶的jar包如jeejar支持JSP等運行的jar等(此類問題SystemOutlog或者SystemErrlog中通常會報錯)如果自己無法判斷則略過此步本次錯誤診斷中檢查客戶應用發現WEBINF/lib目錄中jar包數量眾多且客戶除了使用myfaces還有其他大量開源項目不能明確斷定有問題的與WAS沖突的jar包
.到/support以及googlebaidu上搜索關鍵字JSFmyfacesWebSphere得到一些建議
Apache Tomahawk configuration error with Apache MyFaces and WebSphere Application Server and :
_US&cs=utf&cc=us&lang=en
Using MyFaces JSF and WebSphere Application Server V and V:
_US&cs=utf&cc=us&lang=en
sitemeshmyfacesrichfaces的集成解決方案
按照搜到的建議操作頁面仍無法顯示為了分離錯誤縮小診斷范圍進行第步
.到myfaces項目網站下載與客戶應用同一版本的最簡單的sample應用myfacesexamplesimplewar在WAS上安裝進行測試頁面無法顯示進行第步更改類加載路徑也無法顯示檢查myfacesexamplesimplewar的lib目錄刪除掉xmlapisbjar和xmlParserAPIsjar包運行成功
.回到客戶應用刪除掉xmlapisbjar和xmlParserAPIsjar更改類加載路徑頁面正常顯示
.如果實際診斷中能夠明確斷定是某個類的加載出了問題可以打開詳細類裝入選擇應用程序服務器/server/進程定義/Java虛擬機選擇詳細類裝入如下圖
src=http://imgeducitycn/img_///jpg>
重啟WAS之後在native_stderrlog中可以看到類的加載信息例如
class load: org
apache
taglibs
standard
tlv
JstlBaseTLV from: file:/D:/Program/was
/AppServer/profiles/TestProfile/installedApps/wdanNode
Cell/myfaces
example
simple
_
_
_war
ear/myfaces
example
simple
war/WEB
INF/lib/jstl
jar
如果還需要類加載的更詳細信息可以在診斷跟蹤中設置 *=info: comibmwsclassloader*=all具體做法為登陸管理控制台左邊導航樹選擇故障診斷/日志和跟蹤然後在右面區域選擇進程名(單機環境通常為server)/診斷跟蹤然後選擇更改日志詳細信息級別設置*=info: comibmwsclassloader*=all保存
src=http://imgeducitycn/img_///jpg>
src=http://imgeducitycn/img_///jpg>
重啟WAS在profile_root/logs/server/tracelog中就可以看到類加載的詳細信息例如
> loadClass name=llaborator
PortletServletCollaborator
…
com
ibm
ws
classloader
CompoundClassLoader@
f
f
Local ClassPath: D:\Program\was
\AppServer\systemApps\isclite
ear\struts
jar;
…
Delegation Mode: PARENT_FIRST
[
:
:
:
CST]
a CompoundClass < loadClass Exit
需要注意的是開源項目為應用開發節省了很多工作量但開發人員使用開源項目時最好對該開源項目的運行機制代碼以及要使用的應用服務器類加載機制有較好的理解以便於錯誤診斷
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27106.html