domingo, 11 de diciembre de 2011

La combinación de bibliotecas compartidas y extendedDocumentRoot en WebSphere 6.1




WebSphere 6.1 es un servidor de aplicaciones java quizá un poco sobre cargado en funciones y en diseño, pero entre esta funciones existen algunas que me ha resultado interesantes en el momento que tenia la necesidad de compartir páginas JSP y añadir al classloader del módulo WAR algunos JARS. La combinación de estas dos tecnologías permite crear funcionalidades fuera del contexto web y accesibles desde éste, en definitiva permite compartir recursos entre contextos.

Por una lado se debe utilizar la propiedad de motos de JSP “extendedDocumentRoot”, que tal cómo se indica en la ayuda infocenter de WebSphere v6.1:

extendedDocumentRoot:
Para compartir un recurso de archivo JSP en todos los archivos de aplicación web, especifique una lista de valores separados por comas de directorios o archivos de archivado Java (JAR) o ambos, como vías de acceso de búsqueda a utilizar si el recurso solicitado no se encuentra en el árbol público de documentos del archivo de la aplicación web. Si la petición es una petición parcial válida para un archivo de bienvenida, se devuelve un error 404. Si el archivo JSP se encuentra dentro de un archivo JAR y reloadEnabled es true, se utilizará la indicación de la hora del archivo JAR para las comprobaciones de isOutDated a efectos de recompilación. El valor por omisión de este parámetro es nulo.”

En pocas palabras, dentro del fichero “ibm-web-ext.xmi”, se añade la propiedad de motor de JSP “extendedDocumentRoot” que apunte a un directorio contenedor de JSPs, y el resultado es que estás JSPs són accesibles desde el contexto web.

Ejemplo de fichero “extendedDocumentRoot”:



<?xml version="1.0" encoding="UTF-8"?>
<webappext:WebAppExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappext="webappext.xmi" xmi:id="WebAppExtension_1323629617174" reloadInterval="3" reloadingEnabled="true" additionalClassPath="" fileServingEnabled="true" directoryBrowsingEnabled="false">
<webApp href="WEB-INF/web.xml#WebApp_ID"/>
<jspAttributes xmi:id="JSPAttribute_1"
name="extendedDocumentRoot" value="/opt/IBM/WebSphere/jsps"/>

<jspAttributes xmi:id="JSPAttribute_2"
name="trackDependencies" value="true"/>
</webappext:WebAppExtension>


Nota: Además de la propiedad extendedDocumentRoot, se ha utlizado la propiedad trackDependencies, en este caso útil si se quieren realizar includes estáticos de JSP y se pretende forzar la compilación siempre.



Bien, una vez comentado cómo compartir páginas es interesante comentar cómo añadir conjuntos de JARs, bibliotecas compartidas, al classloader de módulo (WAR).
 Para ello se puede utilizar la funcionalidad de biblioteca compartida que implementa WebSphere. Hay que comentar que una biblioteca compartida puede estar a nivel de classloader de servidor, de aplicación EAR o de módulo web (WAR), en este caso resulto muy útil utilizarlo a nivel de WAR.

Lo primero y antes de seguir es importante definir que es una biblioteca compartida:


Las bibliotecas compartidas son archivos utilizados por varias aplicaciones. Toda biblioteca compartida consta de un nombre simbólico, una classpath de Java y una vía de acceso original para cargar las bibliotecas JNI (Java Native Interface). Puede utilizar las bibliotecas compartidas para reducir el número de archivos de biblioteca duplicados en el sistema. “

En definitiva, una biblioteca compartida no es nada más que un nombre lógico asociado a un classpath que contiene uno o varios JARs y estos son accesibles desde las diferentes aplicaciones, contextos o servidores que en su definición dicen utilizar esta biblioteca.

Para definir una biblioteca compartida se puede utilizar la consola administrativa de WAS:

Entorno > Bibliotecas compartidas > nombre_biblioteca_compartida.

Y para determinar por ejemplo que un módulo web utiliza la biblioteca:

  • Pulse Aplicaciones > Aplicaciones de empresa > nombre_aplicación >Referencias de bibliotecas compartidas en el árbol de navegación de la consola para acceder a la página de bibliotecas compartidas.
  • En la página Referencias de bibliotecas compartidas, seleccione una aplicación o un módulo con los que desee asociar una biblioteca compartida.
(http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp)

Combinando estas dos funcionalidades se puede conseguir las páginas JSP de “extendedDocumentRoot” tengan funcionalidades implementadas dentro de una biblioteca compartida y todo esto accesible desde los contextos que lo quieran utilizar y sin necesidad de estar desplegado en el propio módulo.

No hay comentarios:

Publicar un comentario