Java EE 客户机应用程序类装入

运行 Java™ Platform, Enterprise Edition (Java EE) 应用程序客户机时,将创建类装入器的层次结构以装入应用程序所使用的类。

以下列表描述了类装入器层次结构:
  • Application Client for WebSphere® Application Server (Application Client) 运行时将此值设置为 WAS_LOGGING 环境变量。
  • [z/OS][AIX Solaris HP-UX Linux Windows] extensions class loader 是引导程序类装入器的子代。 此类装入器包含 java/jre/lib/ext 目录中的 JAR 文件或 Java 命令上的 -Djava.ext.dirs 参数定义的 JAR 文件。 Application Client 客户机运行时不设置 -Djava.ext.dirs 参数。 因此它使用 java/jre/lib/ext 目录中的 JAR 文件。
  • [IBM i]扩展类装入器是引导程序类装入器的子代。 此类装入器包含 app_server_root /java/ext 目录, java_home/lib/ext 或 java_home/jre/lib/ext 目录以及 /QIBM/UserData/Java400/ext 目录中的 JAR 文件。 app_server_root 目录是产品安装路径。 java_home 目录是 Java 文件的安装路径。
    [IBM i]注意: java_home 参数可以是三个值中的任何一个,具体取决于启用的 Java 虚拟机 (JVM)。 可能的值有以下三个:
    • /QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit (Java SE 6 32 位)
    • /QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit (Java SE 6 64 位)
  • 系统类装入器包含由 Java 命令上的 -classpath 参数定义的 JAR 文件和类。 Application Client 运行时将此参数设置为 WAS_CLASSPATH 环境变量。
  • WebSphere 类装入器将装入 Application Client 运行时以及放在 Application Client 用户目录中的任何类。 此类装入器使用的目录由 WAS_EXT_DIRS 环境变量定义。 WAS_BOOTCLASSPATHWAS_CLASSPATH, 并且在 app_server_root/bin/setupCmdLine 脚本中为 WebSphere Application Server 安装设置了 WAS_EXT_DIRS 环境变量。 或者在用于客户机安装的 app_server_root/bin/setupClient 脚本中。

随着 Java EE 应用程序客户机运行时初始化,将创建其他类装入器作为 WebSphere 类装入器的子代。 如果客户端应用程序使用 Java DataBase Connectivity ( JDBC ) API、Java Message Service (JMS) API 或 Uniform Resource Locator ( URL ) 等资源,则需要创建不同的类加载器来加载这些资源。 最后,应用程序客户端运行时会设置 WebSphere 类加载器,通过重复处理客户端 JAR 清单来加载 EAR 文件中的类。 从不使用 CLASSPATH 环境变量定义的系统类路径,它不是类装入器层次结构的一部分。

要正确打包客户机应用程序,您必须了解使用哪个类装入器来装入类。 当 Java 代码装入类时,会将用于装入该类的类装入器分配给该类。 该类后面装入的所有类都使用该类装入器,或使用它的任何父类装入器,但不会使用它的子类装入器。

在某些情况下,当装入客户机应用程序类的类装入器不同于 Application Client 运行时为它创建的类装入器时,Application Client 运行时可以检测出来。 当检测到这种情况时,会看到以下消息:
WSCL0205W: The incorrect class loader was used to load [0]
当客户机应用程序类由层次结构中某个父类装入器装入时,会显示此消息。 这种情况通常是由于 EAR 文件和硬盘驱动器上包含相同的类而造成的。 如果某个父类装入器找到一个类,那么该类装入器在 Application Client 运行时类装入器装入该类之前将它装入。 在某些情况下,您的客户机应用程序仍然正确运行。 但是,在大多数情况下,您会收到 class not found 异常。

配置 classpath 字段

打包 Java EE 客户机应用程序时,必须配置各种类路径字段。 理论上,您应该将应用程序的所有需要打包到 EAR 文件。 这是将 Java EE 客户机应用程序分发到客户机的最简单方法。 然而,您不应该将诸如 JDBC API、JMS API 或 URL 的资源打包。 对于这些资源,使用类路径引用来访问硬盘驱动器上的那些类。 您也许在客户端机器上安装了无需重新分发的其他类。 在这种情况下,您也要使用类路径引用访问硬盘驱动器上的类,请见本主题稍后的描述。

EAR 文件中的引用类

WebSphere 产品 Java EE 应用程序不使用系统类路径。 使用 MANIFEST Class 路径条目引用 EAR 文件中的其他 JAR 文件。 使用组装工具配置这些值。 例如,如果客户机应用程序需要访问 EJB JAR 文件的路径,那么将部署的企业 Bean 模块名添加到应用程序客户机类路径。 每个不同的模块(应用程序客户机、EJB、Web)的类路径字段的格式是相同的:
  • 值必须引用 EAR 文件中包含的 JAR 和类文件。
  • 值必须与 EAR 文件根相关。
  • 这些值不能是文件系统中的绝对路径。
  • 多个值必须用空格分隔,不能用冒号或分号分隔。
注意: 这是允许应用程序独立于平台运行的 Java 方法。

通常,向 EAR 文件的根添加模块(JAR 文件)。 这样,您只需在 Class 路径字段指定模块(JAR 文件)的名称。 如果选择使用路径添加模块,那么需要指定与 EAR 文件根相关的路径。

要引用类文件,您必须指定与 EAR 文件根相关的目录。 使用组装工具,您可以向 EAR 文件添加独立的类文件。 建议您将这些附加类文件打包到 JAR 文件中。 将此 JAR 文件添加到模块 Class 路径字段中。 如果将类文件添加到 EAR 文件的根目录,请添加 ./ 到模块类路径字段。

考虑以下示例目录结构,其中文件 myapp.ear 包含名为 myclient.jar 的应用程序客户机 JAR 文件和 mybeans.jar EJB 模块。 其他类驻留在 class1.jarutility/class2.zip 文件中。 名为 xyz.class 的类文件没有打包到 JAR 文件中,但位于 EAR 文件的根中。 指定 ./ mybeans.jar utility/class2.zip class1.jar 作为类路径属性的值。 搜索顺序为: myapp.ear/myclient.jar myapp.ear/xyz.class myapp.ear/mybeans.jar myapp.ear/utility/class2.zip myapp.ear/class1.jar

不在 EAR 文件中的引用类

使用 launchClient -CCclasspath 参数。 在运行时指定此参数,并采用特定于平台的类路径值,这意味着用分号或冒号分隔多个值。 在这方面,客户机与服务器类似。

资源类路径

使用 Application Client Resource Configuration Tool[z/OS] (ACRCT) 或 z/OS® ACRCT 脚本编制工具配置客户机应用程序所使用的资源时,可以指定资源所需的类路径。 例如,如果应用程序正在将 JDBC 用于 DB2® 数据库,请将 db2java.zip 添加到数据库提供程序的类路径字段。 这些类路径值是特定于平台的,并且需以分号或冒号来分隔多个值。

在 WebSphere Application Server for i5/OS上,如果使用 IBM® Developer Kit for Java JDBC 提供程序来访问 DB2/400, 您不必将 db2_classes.jar 文件添加到类路径。 但是,如果使用 IBM Toolbox for Java JDBC 提供程序,请指定 jt400.jar 文件的位置。

使用 launchClient API

如果使用 launchClient 命令,那么将为您创建 WebSphere 类装入器层次结构。 然而,如果您使用 launchClient API,您必须自己执行该设置。 在定义 Java 系统属性时复制 launchClient shell 命令。