¿Tomcat carga el mismo archivo de biblioteca en la memoria dos veces si están en dos aplicaciones web?

StackOverflow https://stackoverflow.com/questions/267953

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo dos aplicaciones en la carpeta tomcat / webapps .

tomcat/webapps/App1
tomcat/webapps/App2

Ambas aplicaciones comparten las mismas bibliotecas. Que se almacenan, por ejemplo, en tomcat / webapps / App1 / WEB-INF / lib .

¿Ambas bibliotecas se cargan dos veces en la memoria?

¿Debo poner estas bibliotecas compartidas en tomcat / server / lib ?

¿Fue útil?

Solución

Como puede ver aquí , Tomcat crea un cargador de clases por aplicación web en su servidor. Por lo tanto, si tiene webapp1 y webapp2 que comparten la misma biblioteca, esta biblioteca se cargará dos veces.

Puede colocar esta biblioteca en el directorio común (tomcat-dir / common / lib) si es compartida por todas webapps que se ejecutan en su servidor Tomcat.

Otros consejos

No recomendaría colocar los archivos jar en la carpeta compartida. Digamos, por ejemplo, que necesita en el futuro implementar una aplicación de terceros, que tenga una versión más nueva de un archivo jar en la carpeta WEB-INF. Para esta aplicación, las clases del jar se cargarán dos veces (incluso si tienen los mismos nombres), una de la carpeta compartida y otra de la carpeta de la aplicación web. Esta situación puede causar errores muy difíciles de encontrar.

Si los archivos jar están en las carpetas de la aplicación web, se cargan mediante cargadores de clases separados y no interfieren entre sí.

Por experiencia: las dos aplicaciones web están completamente aisladas una de la otra, las bibliotecas de una no se utilizan en otra, por lo tanto, para responder a su pregunta inicial, sí, se cargarían dos veces.

Para responder a su segunda pregunta, si debe implementar estas bibliotecas en el directorio compartido de Tomcat, diría que no, y he aquí por qué:

Si implementa un Jar de biblioteca en la ubicación compartida (tomcat / server / lib), esa versión de la biblioteca se convierte en la predeterminada para todas las aplicaciones web que se ejecutan en esa instancia de Tomcat. Como puede ver en esta descripción general de la arquitectura tomcat , la clase- el cargador funciona `` en la cadena '', con la carpeta lib de una aplicación web individual siendo el último lugar donde buscará antes de que arroje una excepción de clase no encontrada. Esto no es cierto en Tomcat 6 y Tomcat 7: cualquier clase en la biblioteca de aplicaciones web y la carpeta de clases se resolverá antes que las comunes, y por lo tanto, esto no romperá otras aplicaciones que implementan todos sus tarros en la guerra 2 .

El problema, por lo tanto, de implementar una biblioteca compartida en ese directorio es que rompe la arquitectura para aplicaciones individuales que están aisladas unas de otras. Bien en su ejemplo inicial, pero si desea implementar una aplicación de terceros (p. Ej., Si está ejecutando una aplicación que consume Portlet para manejar contenido específico), inmediatamente se enfrenta a problemas de dependencia de la versión: su versión compartida de una biblioteca puede no es correcto para la aplicación de terceros, pero debido a que el paquete ya está cargado, arrojará excepciones a la izquierda y al centro.

Estamos usando tomcat6 y encontramos una buena manera de tener tomcat lleno de bibliotecas comunes que todas nuestras aplicaciones web necesitan.

Edite en conf / catalina.properties la entrada common.loader . P.ej. agregue una carpeta adicional con los frascos que desea compartir 'mylibs'

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,
              ${catalina.home}/lib,${catalina.home}/lib/*.jar,
              {catalina.home}/mylibs/*.jar

Luego ponga todas las bibliotecas comunes allí. Listo.

¿Por qué comenzamos a usar una carpeta mylibs en lugar de WEB-INF / lib en todas las aplicaciones web (archivos WAR)?

¡La implementación comenzó a ser una pesadilla después de que la GUERRA cruzó la línea de 50MB!

Al tener una aplicación web con una versión de nunca jar, todavía puede ponerla en WEB-INF / lib para sobrescribir lo que tiene en mylibs .

Si no desea que sus bibliotecas se carguen dos veces, introdúzcalas:

  • Tomcat 6: $CATALINA_HOME/lib
  • Tomcat 5: $CATALINA_HOME/common/lib

(eliminado de la pregunta y copiado aquí para que pueda ser votado / comentado)

PermGen Space of heap se utiliza para almacenar clases y metadatos sobre clases en Java.

Error java.lang.OutOfMemoryError: el espacio PermGen puede ocurrir con frecuencia porque estamos cargando muchas bibliotecas duplicadas en apache tomcat ¿Alguien puede compartirlo en detalle?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top