在共享库中配置本机库

本机库是特定于平台的库文件,其中包括 .dll.so 或 *SRVPGM 对象,可以在共享库中配置他们。 每当共享库与应用程序相关联时,本机库就对应用程序类装入器可视。 同样,每当共享库与应用程序服务器相关联时,本机库就对应用程序服务器类装入器可视。

准备工作

设计共享库时,请考虑下列与 Java 本机库支持相关的条件:
  • Java 虚拟机 (JVM) 仅允许一个类装入器装入特定的本机库。
  • 没有用于从类装入器中卸装本机库的应用程序编程接口 (API)。

    在垃圾回收期间,当从堆中收集发现本机库的类装入器时,JVM 就会卸装该库。

  • 与本机 JVM 类装入器不同,应用程序服务器类装入器只装入使用了当前平台的缺省操作系统扩展名的本机共享库。 例如,在 AIX 上,本机共享库必须以 .a 结尾才能被应用程序服务器类装入器装入。 JVM 类装入器将装入以 .a.so 结尾的文件。

    [AIX]Java Web Start 只能装入以 .so 文件扩展名结尾的本机共享库。 对于任何要打包在 Java 归档 (JAR) 文件中以便进行 Java Web Start 部署的本机共享库,请将其重命名为具有 .so 文件扩展名。

  • 应用程序服务器类装入器在应用程序服务器运行期间将一直存在。
  • 应用程序类装入器在应用程序停止或动态重新装入之前将一直存在。

    如果配置了本机库路径的共享库与某个应用程序相关联,那么每当重新启动或动态地重新装入该应用程序时,该应用程序可能因发生 UnsatisfiedLinkError 错误而失败,该错误指示已装入该库。 发生此错误的原因是,当该应用程序重新启动时,它将调用共享库类以重新装入本机库。 但是,由于尚未对先前装入该本机库的应用程序类装入器进行垃圾收集,所以该库仍在内存中。

  • 只有 JVM 类装入器能够装入被依赖本机库。

    例如,如果 NativeLib1 依赖于 NativeLib2,那么 NativeLib2 必须对 JVM 类装入器可视。 必须在 LIBPATH 环境变量定义的 Java 库路径中指定包含 NativeLib2 的路径。

    如果共享库中配置的本机库依赖于其他本机库,那么必须在主管应用程序服务器的 JVM 的 LIBPATH 中配置那些被依赖库,这样才能成功地装入该本机库。

有关此任务

在配置共享库时共享库设置页面,如果您指定一个值本机库路径,此路径上的本机库未位于WebSphere® Application Server应用程序或共享库类加载器,除非加载本机库的类本身是由同一个类加载器加载的。

因为本机库不能被类装入器装入多次,所以最好在与应用程序服务器类装入器相关联的共享库中装入本机库,这是因为,这些类装入器将在服务器生存期内一直存在。

过程

  1. 在装入本机库的类中实现静态方法。

    在装入本机库的类中,在 static 块中调用 System.loadLibrary(native_library)。 例如:

    static {System.loadLibrary("native_library");

    这将在该类的静态初始化期间装入 native_library,此操作只在类装入时执行一次。

  2. 共享库设置页面,设定值类路径本机库路径这使得共享库能够加载本地库。

    如果要使共享库与某个应用程序或模块相关联,请同时选中对此共享库使用隔离式类装入器。 如果未启用此设置,请使共享库与应用程序服务器相关联。

  3. 关联共享库。
    • 如果您没有启用为该共享库使用独立的类加载器将共享库与应用服务器关联

      使共享库与应用程序服务器的类装入器相关联,而不是与应用程序的类装入器相关联,这样能确保共享库刚好只被应用程序服务器类装入器装入一次,即使服务器上的应用程序重新启动或动态地重新装入亦如此。 由于本机库是在 static 块中装入的,所以永远不会将本机库装入多次。

    • 如果您启用为该共享库使用独立的类加载器将共享库与应用程序或模块关联

      如果使隔离式共享库文件与应用程序或模块相关联,那么将在为该共享库创建的独立类装入器中装入该共享库所表示的类。 如果要使用独立的类装入器来装入共享库,请不要使隔离式共享库文件与服务器相关联。 如果使共享库与服务器相关联,那么产品将忽略隔离设置,并且仍会将该共享库中的文件添加到应用程序服务器类装入器。 即,如果使隔离式共享库文件与服务器相关联,那么将使该文件与该服务器上的所有应用程序相关联。

      未重新装入为已隔离的共享库创建的类装入器,并且与服务器类装入器相似,此类装入器在服务器的生存期内都存在。 对于共享本机库,可以使用已隔离的共享库来避免重新装入本机库时出错。

下一步做什么?

要验证应用程序能否使用共享库,请测试该应用程序或者在类装入器查看器中检查类装入器。 点击故障排除>类加载器查看器>模块名称>表格视图。 应用程序模块类装入器的类路径列出了共享库所使用的类。