类装入器
类装入器查找并装入类文件。类装入器允许服务器上部署的应用程序访问可用类和资源的存储库。应用程序开发者和部署者必须考虑类和资源文件的位置以及用于访问那些文件的类装入器,以使这些文件可用于已部署应用程序。
请参阅下列有关 WebSphere® Application Server 中的类装入器的信息:
使用的类装入器以及使用顺序
产品运行时环境按以下顺序使用以下类装入器来查找和装入应用程序的新类:
- Java™ 虚拟机创建的引导程序、扩展和 CLASSPATH 类装入器
引导程序类装入器使用引导类路径(通常是 jre/lib 中的类)找到并装入类。扩展类装入器使用系统属性 java.ext.dirs(通常是 jre/lib/ext)找到并装入类。CLASSPATH 类装入器使用 CLASSPATH 环境变量查找和装入类。
- WebSphere 扩展类装入器
WebSphere 扩展类装入器装入在运行时需要的 WebSphere Application Server 类。WebSphere Application Server 类作为一组 OSGi 捆绑软件提供。在 OSGi 类装入器的网络中,每个捆绑软件由一个单独的类装入器装入。扩展类装入器委派网关类装入器从该 OSGi 类装入器网络装入类。从 OSGi 类装入器网络导出的包通过网关对应用程序公开。有关详细信息,请参阅OSGi 类装入器方式。
避免故障: Java Platform Enterprise Edition (Java EE) 应用程序编程接口 (API) 在 javax.j2ee.*.jar 捆绑软件中提供,这些捆绑软件在 OSGi 类装入器网络中装入且通过网关对应用程序可见。由于在 OSGi 捆绑软件中部署的类对 Java 虚拟机类装入器不可见,因此请勿使用 CLASSPATH 环境变量或 java.ext.dirs 和 java.lang.classpath 系统属性来指定依赖于 Java EE API 的库的路径。此外,请勿使用 CLASSPATH、java.ext.dirs 和 java.lang.classpath 指定应用程序库的路径,因为这些库可能会导致链接错误或意外服务器行为。gotcha
WebSphere 扩展类装入器使用 ws.ext.dirs 系统属性,确定用于装入非 OSGi 捆绑软件所提供的类和资源的路径。ws.ext.dirs 类路径中的每个目录和这些目录中的每个 Java 归档 (JAR) 文件或压缩文件都会添加到此类装入器使用的类路径中。
如果安装在服务器上的应用程序模块引用了与资源提供程序相关联的资源,并且该提供程序指定了资源驱动程序的目录名称,那么 WebSphere 扩展类装入器还将资源提供程序类装入到服务器中。
- 一个或多个应用程序模块类装入器,他们负责装入在服务器中运行的企业应用程序的元素
应用程序元素可以是 Web 模块、企业 Bean (EJB) 模块、资源适配器归档(RAR 文件)和依赖项 JAR 文件。应用程序类装入器按照 Java EE 类装入规则从企业应用程序装入类和 JAR 文件。产品允许您将共享库与应用程序相关联。
- 零个或多个 Web 模块类装入器
缺省情况下,Web 模块类装入器装入 WEB-INF/classes 和 WEB-INF/lib 目录的内容。Web 模块类装入器是应用程序类装入器的子代。可以指定使用应用程序类装入器来装入 Web 模块的内容,而不是使用 Web 模块类装入器来装入这些内容。

每个类装入器都是上一个类装入器的子代。即,应用程序模块类装入器是 WebSphere 扩展类装入器的子代,而后者是 CLASSPATH Java 类装入器的子代。每当需要装入一个类时,类装入器通常将请求委派给它的父类装入器执行。如果没有任何父类装入器能够找到该类,那么原始类装入器就会尝试装入该类。请求只能转至父类装入器;他们不能转至子类装入器。如果请求 WebSphere 扩展类装入器查找 Java EE 模块中的类,那么它无法转至应用程序模块类装入器来查找该类,并且将发生 ClassNotFoundException 错误。在类装入器装入一个类后,它尝试装入的任何新类都会重复使用同一类装入器或沿优先顺序列表查找,直到找到该类为止。
类装入器隔离策略
应用程序模块类装入器的数目和功能取决于服务器配置中指定的类装入器策略。类装入器为隔离应用程序和模块提供多个选项以使得不同的应用程序打包方案能够在一台应用程序服务器上运行。
两个类装入器策略控制隔离应用程序和模块:
类装入器策略 | 描述 |
---|---|
应用程序 | 应用程序类装入器装入 EJB 模块、被依赖 JAR 文件、嵌入式资源适配器和限于应用程序范围的共享库。根据应用程序类装入器策略,应用程序类装入器可以由多个应用程序共享 (Single) 或者对于每个应用程序是唯一的 (Multiple)。应用程序类装入器策略控制系统中正在运行的应用程序的隔离。设为 Single 时,不隔离应用程序。设为 Multiple 时,应用程序彼此隔离。 |
WAR | 缺省情况下,Web 模块类装入器装入 WEB-INF/classes 和 WEB-INF/lib 目录的内容。应用程序类装入器是 Web 模块类装入器的父代。可以通过更改应用程序的 Web 应用程序归档 (WAR) 类装入器策略来更改缺省行为。 WAR 类装入器策略控制隔离 Web 模块。如果此策略设为 Application,那么 Web 模块内容也由应用程序类装入器装入(除了 EJB 文件、RAR 文件、依赖项 JAR 文件和共享库之外)。如果策略设为 Module,那么每个 Web 模块接收它自己的类装入器(其父代是应用程序类装入器)。 提示: 控制台与底层的 deployment.xml 文件对 WAR 类装入器策略值使用不同的名称。在控制台中,WAR
类装入器策略值是 Application 或 Module。但是,在设置策略的底层
deployment.xml 文件中,WAR 类装入器策略值是
Single(而不是 Application)或
Multiple(而不是 Module)。Application
与 Single 相同,Module 与 Multiple 相同。
|
对于系统中的每个应用程序服务器,您可以设置应用程序类装入器策略为 Single或 Multiple。当应用程序类装入器策略设为 Single 时,则单个应用程序类装入器装入系统中的所有 EJB 模块、依赖项 JAR 文件和共享库。当应用程序类装入器策略设为 Multiple 时,那么每个应用程序接收装入该应用程序的 EJB 模块、依赖项 JAR 文件和共享库时所使用的它自己的类装入器。
如果应用程序的 WAR 类装入器策略设为 Application,那么应用程序类装入器将从 Web 模块装入类。如果应用程序的 WAR 类装入器策略设为 Module,那么每个 WAR 模块都接收它自己的类装入器。
以下示例显示当应用程序类装入器策略设为 Single 时,单个应用程序类装入器装入服务器上所有应用程序的所有 EJB 模块、依赖项 JAR 文件和共享库。如果应用程序将它的 WAR 类装入器策略设为 Application,那么单个应用程序类装入器还可以装入 Web 模块。将 WAR 类装入器策略设为 Module 的应用程序使用 Web 模块的独立类装入器。
Server's application class-loader policy: Single
Application's WAR class-loader policy: Module
Application 1
Module: EJB1.jar
Module: WAR1.war
MANIFEST Class-Path: Dependency1.jar
WAR Classloader Policy = Module
Application 2
Module: EJB2.jar
MANIFEST Class-Path: Dependency2.jar
Module: WAR2.war
WAR Classloader Policy = Application

下列示例显示当应用程序服务器的应用程序类装入器策略设为 Multiple 时,服务器上的每个应用程序都有它自己的类装入器。如果应用程序 WAR 类装入器策略设为 Application,那么应用程序类装入器还装入它的 Web 模块。如果策略设为 Module,那么 Web 模块使用它自己的类装入器。
Server's application class-loader policy: Multiple
Application's WAR class-loader policy: Module
Application 1
Module: EJB1.jar
Module: WAR1.war
MANIFEST Class-Path: Dependency1.jar
WAR Classloader Policy = Module
Application 2
Module: EJB2.jar
MANIFEST Class-Path: Dependency2.jar
Module: WAR2.war
WAR Classloader Policy = Application

类装入器方式
类装入器委派方式(也称为类装入器顺序)确定类装入器是否将类的装入操作委派给父类装入器执行。支持下列类装入器方式值:
类装入器方式 | 描述 |
---|---|
父代最先 也称为父类装入器装入的类最先。 |
首先装入父类类装入器方式导致类装入器先将类的装入委派给它的父类装入器进行,然后再尝试从它的本地类路径中装入类。此值是类装入器策略和标准 JVM 类装入器的缺省值。 |
父类最后 也称为本地类装入器装入的类最先或应用程序最先。 |
最后装入父类类装入器方式导致类装入器在将类装入委派给它的父类之前,尝试从本地类路径装入类。使用此策略,应用程序类装入器可覆盖并提供存在于父类装入器中的其自己版本的类。 |
以下设置确定类装入器的方式:
- 如果应用程序服务器的应用程序类装入器策略是 Single,那么服务器级方式值定义了应用程序类装入器的方式。
- 如果应用程序服务器的应用程序类装入器策略是 Multiple,那么应用程序级方式值定义了应用程序类装入器的方式。
- 如果应用程序的 WAR 类装入器策略是 Module,那么模块级方式值定义了 WAR 类装入器的方式。
OSGi 类装入器方式
- 每个捆绑软件仅对其显式导出的 Java 软件包可视。
- 每个捆绑软件都显式声明其软件包依赖性。
- 软件包可在特定的版本导出和导入,或在特定的版本范围导出和导入。
- 软件包的多个版本可同时用于不同的客户机。
有关 OSGi 的更多信息,请参阅“OSGi 框架”主题。