类装入器查找并装入类文件。为了使部署的应用程序能够正确运行,必须对影响该应用程序及其模块的类装入器进行配置,以使该应用程序能够找到它所需的文件和资源。类装入器问题的诊断工作可能相当复杂并且耗时。为了更快地诊断和解决问题,请使用管理控制台的“类装入器查看器”来检查类装入器和每个类装入器装入的类。
开始之前
本主题假定您已将应用程序安装在该产品支持的服务器上,并且要检查应用程序或其模块使用的类装入器。模块可以是 Web 模块(.war 文件)或企业 Bean (EJB) 模块(.jar 文件)。“类装入器查看器”使您能够在运行时环境中检查类装入器。
本主题还假定您已启用类装入器查看器服务。单击,启用服务并重新启动服务器。
关于此任务
WebSphere® Application Server
的运行时环境按以下顺序使用下列类装入器来查找和装入应用程序的新类:
- Java 虚拟机创建的引导程序、扩展和 CLASSPATH 类装入器
- WebSphere 扩展类装入器
- 一个或多个应用程序模块类装入器,他们负责装入在服务器中运行的企业应用程序的元素
- 零个或多个 Web 模块类装入器

每个类装入器都是上一个类装入器的子代。即,应用程序模块类装入器是 WebSphere 扩展类装入器的子代,而后者是
CLASSPATH Java 类装入器的子代。每当需要装入一个类时,类装入器通常将请求委派给它的父类装入器执行。如果没有任何父类装入器能够找到该类,那么原始类装入器就会尝试装入该类。请求只能转至父类装入器;他们不能转至子类装入器。在类装入器装入一个类后,它尝试装入的任何新类都会重复使用同一类装入器或沿优先顺序列表查找,直到找到该类为止。
如果未正确配置负责装入应用程序工件的类装入器,Java 虚拟机 (JVM) 在启动或运行该应用程序时就可能会抛出类装入异常。类装入异常描述了未正确配置类装入器时将会导致的异常类型并提供了使用类装入器查看器来更正类装入器配置的方法建议。异常类型包括:
使用“类装入器查看器”来检查类装入器并解决应用程序或类装入器配置问题。
过程
- 检查列示了所有已安装的应用程序及其模块的树形视图。这些模块可以是
Web 模块(.war 文件)或 EJB 模块(.jar
文件)。
单击以访问企业应用程序拓扑页。
- 检查类装入器委派层次结构。
在“企业应用程序拓扑”页中,选择一个模块以访问“类装入器查看器”页。该页面列示了对已安装的企业应用程序中的
Web 和 EJB 模块可视的类装入器。此页面帮助您确定装入了模块文件的类装入器以及诊断类装入器问题。
委派层次结构由对应用程序或 Web 模块指定的类装入器委派方式或类装入器顺序确定。值可以是父类装入器装入的类最先和本地类装入器装入的类最先(父代最后)。请参阅配置类装入器步骤以了解更多信息。
- 导出有关类装入器的信息。
- 在“类装入器查看器”页上,单击导出。
- 进行选择,以便对类装入器信息打开浏览器或编辑器,或者按 XML 格式将该信息保存到磁盘中。
- 单击确定,并按系统的要求指定任何其他信息。
- 使用 HTML 表格式显示关于对模块可视的类装入器的信息。
在“类装入器查看器”页上,单击表视图。“表视图”页将显示以下信息。
表 1. “表视图”页. 有关类装入器属性的可用信息类装入器属性 |
描述 |
委派 |
指示类装入器是否将模块的装入工作委派给它的父类装入器执行。值 true 表示正在使用父应用程序的类装入器(父类装入器装入的类最先)。值 false 表示正在使用模块类装入器(本地类装入的类最先(父类装入器装入的类最后))。请参阅配置类装入器步骤以了解更多信息。 |
类路径 |
列示类装入器搜索类和资源时使用的路径。 |
类 |
列示 JVM 中由这个类装入器装入的类的名称。 |
如果发生了内存不足错误,表视图选项就不会返回值。内存不足错误可能与内存泄漏相关。要检查关于表中类装入器的信息,必须先解决内存不足问题,然后再次单击表视图。
- 搜索类装入器。
在“类装入器查看器”页中,单击
搜索以访问
搜索页,在该页面上,可以在类装入器中搜索下列内容:
- 特定字符串
- 特定 .jar 文件
- 特定目录中的文件名
- 特定类装入器装入的文件名
搜索区分大小写。
类装入异常描述了“搜索”页的几种用法。
- 配置类装入器。 可以为下列各项配置类装入器:
类装入器配置确定哪个类装入器装入应用程序或 Web 模块的类和资源文件。应用程序和 WAR 模块类装入器配置设置包括类装入器顺序和 WAR 类装入器策略。
类装入器顺序值可以是父类装入器装入的类最先或本地类装入器装入的类最先(父代最后)。缺省值为父类装入器装入的类最先。
具有父类装入器装入的类最先方式的类装入器在搜索其类路径之前将类或资源的装入工作委派给它的直接父类装入器执行。
对类装入问题进行故障诊断时,可能需要覆盖对父类装入器可视的类。要使用特定于应用程序的类来覆盖此类,请将包括在其类路径上的应用程序类的类装入器的类装入器顺序设置为本地类装入器装入的类最先(父代最后)。应用程序可以覆盖对父类装入器可视的类,但这样做的话,在混合使用被覆盖的类和未被覆盖的类时可能会导致
ClassCastException 或 UnsatisfiedLinkError。
例如,在缺省类装入器策略下面,Web 模块使用自已的
Web 模块 (WAR) 类装入器来装入它的工件,这些工件通常在
WEB-INF/classes 和 WEB-INF/lib
目录中。应用程序模块类装入器是这个 WAR 类装入器的直接父代。要确保 Web 模块类装入器在这些路径中首先搜索特定类或资源,在将装入操作委派给应用程序模块类装入器之前,先将 Web 模块的类装入顺序设置为首先使用本地类装入器来装入类(最后使用父类装入器)。
类装入器策略确定了应用程序模块类装入器和 WAR 模块类装入器的结构。在缺省策略下,运行的每个应用程序
EAR 都有自己的应用程序模块类装入器,并且每个 Web 模块都有自己的
WAR 模块类装入器。缺省策略确保应用程序工件之间的可视性和隔离方面的 Java EE 一致性。在对类装入问题进行故障诊断时,建议不要更改缺省策略。
下一步做什么
如果仍存在类装入器问题,请参阅类装入异常和类装入。