Configuración de bibliotecas nativas en bibliotecas compartidas

Las bibliotecas nativas son archivos de biblioteca específicos de la plataforma, por ejemplo, objetos .dll, .so o *SRVPGM, que se pueden configurar en las bibliotecas compartidas. Las bibliotecas nativas son visibles para un cargador de clases de aplicación siempre que se asocia la biblioteca compartida con una aplicación. De la misma forma, las bibliotecas nativas son visibles para un cargador de clases de servidor de aplicaciones siempre que se asocia la biblioteca compartida con un servidor de aplicaciones.

Antes de empezar

Cuando diseñe una biblioteca compartida, tenga en cuenta las siguientes condiciones sobre el soporte de biblioteca nativa Java:
  • Java Virtual Machine (JVM) sólo permite un cargador de clases para cargar una determinada biblioteca nativa.
  • No existe ninguna interfaz de programación de aplicaciones (API) para descargar una biblioteca nativa de un cargador de clases.

    Las bibliotecas nativas las descarga la JVM cuando el cargador de clases que ha encontrado la biblioteca se recopila del almacenamiento dinámico durante la recogida de basura.

  • Los cargadores de clases del servidor de aplicaciones, al contrario que el cargador de clases JVM nativo, sólo carga bibliotecas compartidas nativas que utilizan la ampliación predeterminada del sistema operativo para la plataforma actual. Por ejemplo, en AIX, las bibliotecas compartidas nativas deben terminar en .a cuando se cargan mediante cargadores de clases de servidores. El cargador de clases de JVM carga los archivos que terminan en .a o .so.

    [AIX]Java Web Start sólo puede cargar las bibliotecas compartidas nativas que tengan la extensión de archivo .so. Cambie el nombre de las bibliotecas compartidas nativas pertinentes, para que tengan la extensión de archivo .so, antes de empaquetarlas en un archivo JAR (Java archive) para el despliegue de Java Web Start.

  • Los cargadores de clases de servidor de aplicaciones persisten el tiempo que dura el servidor de aplicaciones.
  • Los cargadores de clases de aplicación persisten hasta que la aplicación se detiene o se recarga dinámicamente.

    Si una biblioteca compartida que está configurada con una vía de acceso de biblioteca nativa se asocia con una aplicación, siempre que se reinicia o se recarga dinámicamente la aplicación, puede producirse un UnsatisfiedLinkError en la aplicación indicando que la biblioteca ya está cargada. El error se produce porque, cuando se reinicia la aplicación, invoca la clase de biblioteca compartida para recargar la biblioteca nativa. No obstante, la biblioteca nativa continúa cargada en la memoria, porque todavía no se ha recogido la basura en el cargador de clases de aplicación que ha cargado previamente la biblioteca nativa.

  • Sólo el cargador de clases de JVM puede cargar una biblioteca nativa dependiente.

    Por ejemplo, si NativeLib1 depende de NativeLib2, NativeLib2 debe estar visible para el cargador de clases de JVM. La vía de acceso que contiene NativeLib2 debe especificarse en la vía de acceso de bibliotecas Java definida por la variable de entorno LIBPATH.

    [z/OS]La propiedad LIBPATH (java.library.path) se configura utilizando la variable de entorno nombre_proceso_region_libpath como, por ejemplo, control_region_libpath, server_region_libpath o adjunct_region_libpath. Si desea obtener instrucciones sobre cómo establecer las variables LIBPATH de la región, consulte Cambio de los valores de variables referenciadas en los mensajes BBOM0001I

    Si una biblioteca nativa configurada en una biblioteca compartida depende de otras bibliotecas nativas, las bibliotecas dependientes se deben configurar en la LIBPATH de la JVM que alberga el servidor de aplicaciones para que esa biblioteca se cargue satisfactoriamente.

Acerca de esta tarea

Cuando se configura una biblioteca compartida en una página de valores de biblioteca compartida, si especifica un valor para Vía de acceso de biblioteca nativa, la aplicación WebSphere Application Server o los cargadores de clases de biblioteca compartida no localizan las bibliotecas nativas de esta vía de acceso a menos que la clase que carga la biblioteca nativa la haya cargado el mismo cargador de clases.

Como un cargador de clases no puede cargar más de una vez una biblioteca nativa, es preferible cargar las bibliotecas nativas dentro de las bibliotecas compartidas asociadas con el cargador de clases de un servidor de aplicaciones, ya que estos cargadores de clases persisten durante el ciclo de vida del servidor.

Procedimiento

  1. Implemente un método estático en la clase que carga la biblioteca nativa.

    En la clase que carga la biblioteca nativa, llame a System.loadLibrary(biblioteca_nativa) en un bloque estático. Por ejemplo:

    static {System.loadLibrary("biblioteca_nativa");

    La biblioteca_nativa se carga durante la inicialización estática de la clase, lo que ocurre exactamente una vez cuando se carga la clase.

  2. En la página de valores de biblioteca compartida, establezca los valores de Classpath y Vía de acceso de biblioteca nativa que permiten que la biblioteca compartida cargue la biblioteca nativa.

    Si desea asociar la biblioteca compartida con una aplicación o módulo, seleccione también Utilizar un cargador de clases aislado para esta biblioteca compartida. Si no habilita este valor, asocie la biblioteca compartida con un servidor de aplicaciones.

  3. Asocie la biblioteca compartida.
    • Si no ha habilitado la opción Utilizar un cargador de clases aislado para esta biblioteca compartida, asocie la biblioteca compartida con un servidor de aplicaciones.

      La asociación de una biblioteca compartida con el cargador de clases de un servidor de aplicaciones, en lugar de con una aplicación, garantiza que el cargador de clases de servidor de aplicaciones cargue exactamente una vez la biblioteca compartida, aunque las aplicaciones del servidor se reinicien o se recarguen automáticamente. Como la biblioteca nativa se carga en un bloque estático, la biblioteca nativa nunca se carga más de una vez.

    • Si ha habilitado la opción Utilizar un cargador de clases aislado para esta biblioteca compartida, asocie la biblioteca compartida con una aplicación o un módulo.

      Al asociar un archivo de biblioteca compartida aislada con una aplicación o un módulo se cargan las clases representadas por la biblioteca compartida en un cargador de clases distinto creado para dicha biblioteca compartida. No asocie un archivo de biblioteca compartida aislada con un servidor si desea tener un cargador de clases distinto para una biblioteca compartida. Si asocia la biblioteca compartida con un servidor, el producto omite el valor de aislamiento y añade archivos de la biblioteca compartida al cargador de clases del servidor de aplicaciones. Es decir, al asociar un archivo de biblioteca compartida aislada con un servidor se asocia el archivo con todas las aplicaciones del servidor.

      El cargador de clases creado para una biblioteca compartida aislada no se vuelve a cargar y, como ocurre con un cargador de clases de servidor, existe durante el ciclo de vida de un servidor. Para bibliotecas nativas compartidas, puede utilizar una biblioteca compartida aislada para evitar los errores resultantes de la recarga de bibliotecas compartidas.

Qué hacer a continuación

Para verificar si una aplicación puede utilizar una biblioteca compartida, pruebe la aplicación o examine el cargador de clases en el visor Cargador de clases. Pulse Resolución de problemas > Visor de cargadores de clases > nombre_módulo > Vista de tabla. La classpath del cargador de clases del módulo de aplicación lista las clases utilizadas por la biblioteca compartida.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tcws_sharedlib_nativelib
File name: tcws_sharedlib_nativelib.html