1.1. BES類裝載器層次結構
爲了滿足多種資源和不同模塊的加載需求,BES中構建了非常複雜的類裝載器結構,以下是最基本的裝載器層次結構:
圖中的delegate項指對應ClassLoader默認的委託模式
對各裝載器的說明如下:
編號 |
裝載器 |
說明 |
1 |
ASURLClassLoader |
BES的系統類裝載器 |
2 |
ConnectorClassLoader |
連接器的類裝載器 |
3 |
WebappClassLoader |
WEB應用的類裝載器 |
4 |
EJBClassLoader |
EJB和企業應用的類裝載器 |
5 |
InstanceClassLoader |
實例級別的類裝載器 |
對各裝載器的加載路徑說明如下:
編號 |
裝載器 |
搜索路徑 |
1 |
ASURLClassLoader |
ServerClassPath、classpathPrefix、classpathSuffix、加載bes\config\processLauncher.xml下 System.getProperties("com.bes.classloader.sharedChainJars")、 System.getProperties("com.bes.classloader.sharedChainJars.ee") 指定的jar 和位於lib、3rd 下所有的jar |
2 |
ConnectorClassLoader |
連接器應用的jar,所有應用可以共享 |
3 |
WebappClassLoader |
加載本應用中WEB-INF\classes\,WEB-INF\lib\下的jar和其他類型文件以及附加類庫 |
4 |
EJBClassLoader |
EJB應用的jar 附加類庫 |
5 |
InstanceClassLoader |
共享類庫 ${com.bes.instanceRoot}/lib下的所有jar ${com.bes.instanceRoot}/lib/classes下的所有類 |
1.2. 委託模式及過濾配置
1.2.1. 通用配置
默認情況下,如果應用的jar包中的類包名包含
{"javax", "sun", "org.xml.sax", "org.w3c.dom", "org.apache.xerces", "org.apache.xalan", "org.apache.taglibs.standard", "com.sun.faces", "org.apache.commons.logging"}
|
需要給實例添加以下系統屬性:
名稱 |
com.bes.enterprise.overrideablejavaxpackages |
值 |
以英文逗號分隔的多個包名 |
示例 |
com.bes.enterprise.overrideablejavaxpackages=javax, org.xml.sax |
1.2.2. WebAppClassLoader和EJBClassLoader配置
BES應用中可以通過bes-web.xml、bes-ejb-jar.xml設置應用classloader配置來控制類或資源的加載順序。其中classloader節點屬性delegate,是控制父子classloader加載順序,爲true時,進行父優先加載;爲false時,進行子優先加載;當父優先或子優先加載不到時,再從classloader鏈的反方向進行加載。
配置說明:
Filter配置 |
功能說明 |
<filter package-name=“package name”/> |
加載的class如果在filter的package name中,則根據delegate的設置進行反向的加載。 |
<filter class-name= “class name” /> |
加載的class如果在filter的class name相同,則根據delegate的設置進行反向的加載。 |
<filter resource-file=“resource path” /> |
加載的資源(如xml、properties文件)如果與filter中的resource-file相同,則根據delegate的設置進行反向的加載。 |
<filter resources-scope=“resource path”scope=“all/delegate/self”/> |
Resources-scope指定資源文件名稱。 Scope指定加載的範圍:all爲默認,即加載所有classloader能加載的資源,僅加載parent classloader的資源;self僅加載當前classloader的資源;該條配置不受classloader的delegate影響。 |
配置示例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE bes-web-app PUBLIC "-//BES Tech Service(HK) Co., Ltd.//DTD BES Application Server Servlet 2.5//EN" "http://www.bessystem.com/appserver/dtds/bes-web-app_2_5-0.dtd"> <bes-web-app> <context-root>web</context-root> <class-loader delegate="false"> <filter package-name ="com.bes.test.clientl" /> <filter class-name ="META-INF/services/com.bes.test.TestService" /> <filter resource-file="META-INF/services/test.xml "/> <filter resources-scope="META-INF/services/com.sun.xml.ws.api.client.ServiceInterceptorFactory" scope="self"/> </class-loader> </bes-web-app> |
1.2.3. InstanceClassLoader配置
domain.config中配置實例classloader,其中filter功能與應用classloader相同。
<instance-class-loader delegate="false" > <filter package-name="package name" /> <filter class-name= “class name” /> <filter resource-file=“resource path” /> <filter resources-scope=“resource path”scope=“all/delegate/self”/> </instance-class-loader> |
通過cli命令設置示例:
create --instance-classloader-filter --packagename org.apache.taglibs.standard --target inst1 jstl1 set inst1.instance-class-loader.delegate=false |
1.3. 使用ClassLoaderViewer
BES在Console上提供了可視化的功能組件:ClassLoaderViewer,用於查看應用的類裝載器結構。ClassLoaderViewer針對實例上已部署應用(WEB、EJB、EAR、RAR等)的類裝載器,在Console上提供一種可視化機制,通過本功能,可以查看類裝載器的類型、層次結構、搜索路徑以及已加載的類等。在有類加載相關問題時,可以使用此功能迅速查找原因。以下是使用的步驟。
首先進入實例的菜單:
點擊類裝載:
Cluster是應用名稱,server是虛擬主機的名稱,點擊虛擬主機:
可以點擊層次結構上的各個ClassLoader查看搜索路徑和已加載類以及類的加載路徑。
注意:該功能目前不支持IBMJDK