Problemas con los JAR

Todo lo que voy a explicar aquí viene en la documentación del Tomcat, pero visto que no dejo de cruzarme con problemas relacionados con la colocación de las librerías de las aplicaciones web, voy a hacer un pequeño resumen, a ver si a alguien le es de utilidad.

Para empezar, como norma general, los ficheros JAR de los que dependa una aplicación web deben ir en la carpeta WEB-INF/lib de dicha aplicación.

Aún así, existen otros directorios que Tomcat usa para cargar ficheros JAR y ponerlos a disposición de diferentes contextos:

  • server/lib: las librerías que usa el propio Tomcat para funcionar. Las clases que se carguen desde aquí no estarán disponibles para las aplicaciones web.
  • common/lib: los JAR de este directorio serán visible tanto para Tomcat como para las aplicaciones web; por tanto, aquí se define la única excepción a la regla general: se colocan aquí los drivers JDBC (o el API de JavaMail), cuando se configura un pool de conexiones a la base de datos (o de sesiones SMTP) gestionado por el servidor, y configurado por tanto en el server.xml o en un xml de contexto.
  • shared/lib: las librerías que se carguen desde aquí son visibles para todas las aplicaciones web, pero no para el servidor. Colocar librerías aquí se conocía como “instalarlas a nivel de servicio”, una práctica muy común en el pasado, y que nos ha traído mucho llanto y crujir de dientes. Aunque dos o más aplicaciones instaladas en el mismo Tomcat usen una misma librería, meterla aquí en lugar de en cada uno de los WEB-INF/lib sólo nos ahorra disco duro, por lo general unos KBs, o unos pocos MBs a lo sumo. El espacio de memoria de las aplicaciones es, por lo general, estanco, y no se gana nada en este sentido. NO LO HAGÁIS.

Poner las librerías a nivel de aplicación nos permite usar una versión distinta en cada una, si fuera necesario o conveniente.

En las versiones actuales, Tomcat da prioridad a las librerías en WEB-INF/lib a la hora de cargarlas en el espacio de memoria de la aplicación, lo que ha hecho que nos ahorremos la mitad de los disgustos que vienen por este tema.

En cada una de estas carpetas (common, server, shared, app/WEB-INF) existe también una carpeta classes. Si en ella está colocado un fichero .class con su jerarquía de directorios representando su jerarquía de paquete, la clase en él definida se cargaría desde dicho fichero, y no desde el JAR del lib, si se encontrara también en él. Tenedlo en cuenta, pues si bien es algo muy útil en algunas ocasiones en las que queremos probar una pequeña modificación o hacer debug con System.out de alguna funcionalidad, sin necesidad de recrear el jar por completo, también es cierto que un descuido u olvido puede hacernos pasar un mal rato hasta que nos demos cuenta (si nos damos) de lo que pasa. Ahora que existe Ant, es mejor no arriesgarse y recrear el jar con cada cambio.

Bueno, espero que esto le sirva a alguien, porque hay cada entorno por ahí…


One Comment to “Problemas con los JAR”  

  1. 1 Anónimo

    amén

Leave a Reply