BESAppServer中类装载器

 

1.1. BES类装载器层次结构

为了满足多种资源和不同模块的加载需求,BES中构建了非常复杂的类装载器结构,以下是最基本的装载器层次结构:

 BESAppServer中类装载器_第1张图片

图中的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上提供一种可视化机制,通过本功能,可以查看类装载器的类型、层次结构、搜索路径以及已加载的类等。在有类加载相关问题时,可以使用此功能迅速查找原因。以下是使用的步骤。

 

首先进入实例的菜单:

BESAppServer中类装载器_第2张图片

点击类装载:

BESAppServer中类装载器_第3张图片

Cluster是应用名称,server是虚拟主机的名称,点击虚拟主机:

BESAppServer中类装载器_第4张图片

可以点击层次结构上的各个ClassLoader查看搜索路径和已加载类以及类的加载路径。

注意:该功能目前不支持IBMJDK

你可能感兴趣的:(ClassLoader,类装载器)