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

当你运行Java™ Platform, Enterprise Edition( Java EE ) 应用程序客户端,会创建一个类加载器层次结构来加载应用程序使用的类。

以下列表描述了类装入器层次结构:
  • 这Application Client for WebSphere® Application Server(应用程序客户端)运行时将此值设置为WAS_LOGGING环境变量。
  • [IBM i]扩展类装入器是引导程序类装入器的子代。 此类加载器包含应用程序服务器根目录/java/ext 目录、java_home/lib/ext 或 java_home/jre/lib/ext 目录以及/QIBM/UserData/Java400/ext目录。 这应用程序服务器根目录目录是产品安装路径。 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 位)
  • 系统类加载器包含由-classpathJava 命令上的参数。 Application Client 运行时将此参数设置为 WAS_CLASSPATH 环境变量。
  • 这WebSphere类加载器加载应用程序客户端运行时和放置在应用程序客户端用户目录中的任何类。 此类装入器使用的目录由 WAS_EXT_DIRS 环境变量定义。 这WAS_BOOTCLASSPATHWAS_CLASSPATH ,以及WAS_EXT_DIRS环境变量设置在应用程序服务器根目录/bin/setupCmdLine脚本WebSphere Application Server安装,或在应用程序服务器根目录/bin/setupClient客户端安装脚本。

作为Java EE应用程序客户端运行时初始化时,会创建其他类加载器作为WebSphere类加载器。 如果您的客户端应用程序使用 Java 等资源DataBase连接性( JDBC) API、Java 消息服务 (JMS) API 或统一资源定位器 (URL),会创建不同的类加载器来加载每个资源。 最后,应用程序客户端运行时设置WebSphere类加载器通过重复处理客户端 JAR 清单来加载 EAR 文件中的类。 从不使用 CLASSPATH 环境变量定义的系统类路径,它不是类装入器层次结构的一部分。

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

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

配置 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作为 Classpath 属性的值。 搜索顺序为:myapp.ear/myclient.jar myapp.ear/xyz.class myapp.ear/mybeans.jar myapp.ear/utility/class2.zip myapp.ear/class1.jar

不在 EAR 文件中的引用类

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

资源类路径

当您使用应用程序客户端资源配置工具配置客户端应用程序使用的资源时,您可以指定资源所需的类路径。 例如,如果您的应用程序使用JDBC到DB2®数据库,添加db2java.zip到数据库提供程序的类路径字段。 这些类路径值是特定于平台的,并且需以分号或冒号来分隔多个值。

在WebSphere Application Server为了i5/OS,如果你使用IBM® Developer Kit for JavaJDBC提供者访问DB2/400,您不必添加db2_classes.jar文件到类路径。 但是,如果你使用IBM Toolbox for JavaJDBC提供商,指定位置jt400.jar文件。

使用 launchClient API

如果你使用launchClient命令WebSphere为您创建了类加载器层次结构。 然而,如果您使用 launchClient API,您必须自己执行该设置。 复制launchClientshell 命令定义 Java 系统属性。