Organizando Class Loaders en Apache Tomcat
El dilema
- Que el empaquetado (.war) incluya dicha(s) dependencia(s). Comúnmente utilizando un sistema gestor de dependencias como por ejemplo maven y su scope: compile.
- Que la(s) dependencia(s) se encuentre(n) en el container donde la aplicación será desplegada. En maven utilizando el scope: provided para evitar que el gestor de dependencia incluya los jars dentro del empaquetado.
Seleccionando una solución
- Optimización de espacio de disco duro en el sistema host de la instalación de Tomcat
- Estandarización en los ambientes de deployment
- Empaquetados (.war) con menor tamaño que contribuyen a reducir tiempos en pipelines de Integración y Entrega continua.
- Útil cuando lo que se promueve entre ambientes es el artefacto (.war) y no el código fuente.
- La instalación de tomcat empieza a convertirse en una personalizada y no estándar.
- Requiere que tanto los ambientes locales de desarrollo como los diferentes ambientes de producción estén sincronizados con la última versión personalizada de Tomcat.
- Cambios en una dependencia es replicable para todas las aplicaciones desplegadas en la instancia de Tomcat y si estas poseen diferentes arquitecturas se tendrá que tomar una decisión de no realizar el cambio o desplegar las aplicaciones incompatibles en otra instancia de tomcat. el resultado final será una nueva instancia personalizada.
Class Loaders 101 en apache Tomcat
- Bootstrap: Carga las clases básicas de ejecución provistas en los jars de la JRE que utiliza la instancia de Tomcat.
- System: Se inicializa a partir del contenido de la variable de ambiente classpath.
- Common: Carga clases adicionales que normalmente se encuentran en jars ubicados en: $CATALINA_HOME/lib
- Webapp: Para cada aplicación desplegada tomcat crea un class loader que carga clases ubicadas en /WEB-INF/classes y clases dentro de jars ubicados en /WEB-INF/lib
Bootstrap
|
System
|
Common
/
Webapp1 Webapp2 ...
Bootstrap (1)
|
System (4)
|
Common (5)
|
WebappX
/
/WEB-INF/classes (2) /WEB-INF/lib/*.jar (3)
Iniciando a implementar la solución
Optimizando la solución
$CATALINA_HOME/shared/lib y
$CATALINA_HOME/shared/classes
shared.loader=»${catalina.base}/shared/classes»,»${catalina.base}/shared/lib/*.jar»