BESAppServer中類裝載器

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章