not mvc mkyong locations found example addresourcehandlers java tomcat servlets classpath

java - mvc - spring resources static locations example



Controlar el classpath en un servlet (6)

Nosotros, Spring Log4jConfigListener en nuestro archivo web.xml.

Puede especificar como parámetro de contexto la ubicación del archivo de configuración log4j, es decir, puede configurarlo como /WEB-INF/log4j.xml

¿Esta sería una opción para ti? Si no está usando Spring, sé que puede establecer la ubicación de Log4j de forma programática, lo que también podría funcionar.

Mi aplicación de servlet incluye varios archivos .jar de biblioteca, algunos de los cuales contienen archivos incrustados log4j.xml o log4j.properties. ¡Me gustaría asegurarme de que log4j encuentre mi log4j.xml primero! He intentado buscar alguna especificación de las prioridades de los diversos elementos classpath en un servlet (p. Ej., ¿WEB-INF / clases siempre preceden a WEB-INF / lib?), O alguna forma de configurar o modificar el cargador de clases del servlet para que el directorio de recursos dado aparece temprano en el classpath. Hasta ahora, he dibujado un espacio en blanco. ¿Alguna sugerencia para garantizar que un archivo .war del servlet cargue el log4j.xml correcto a través del cargador de clases?


Por lo que yo entiendo, la selección de recursos del classpath no es determinista (desde el punto de vista del desarrollador de la aplicación). Incluso si el mismo archivo se carga constantemente, el comportamiento podría cambiar: 1. Cuando actualice la versión de su contenedor actual. 2. Si cambia contenedores.

La solución más simple será eliminar los archivos de configuración de log4j incorporados de los archivos jar de la biblioteca . Casi nunca es una buena idea incorporar las configuraciones de log4j, ya que conduce al problema que está viendo aquí ...

¿Son jarras o tarros de terceros que usted desarrolló?


En mi experiencia, WEB-INF / classes generalmente tiene prioridad sobre los archivos jar en WEB-INF / lib, sin embargo, eso también depende del contenedor de servlets que se use (por ejemplo, nunca pude descifrar el comportamiento de JRun). Sería de gran ayuda si pudieras decirme qué contenedor estás usando.

Además, ¿está seguro de que la configuración de log4j ofensiva está en un contenedor en WEB-INF / lib? Normalmente, cuando me encuentro con problemas de classpath en una situación de contenedor de servlets, es debido a las bibliotecas que residen fuera de la aplicación web.

Las especificaciones de servlet recomiendan que los cargadores de clase de la aplicación web carguen sus propias clases antes de delegar en el cargador de clases del contenedor (SRV.9.7.2), pero dado que esto es contrario a la especificación de Java, no todos los proveedores lo hacen de manera predeterminada (de hecho Tomcat es el único contenedor que he usado que hace esto por defecto). Dicho esto, siempre es posible configurar el comportamiento de carga de clase de su aplicación web del contenedor. Si me dices qué contenedor estás utilizando, puedo ayudarte (específicamente, lo he hecho antes con éxito en WebLogic, WebSphere, Glassfish y JRun)).


Necesita tener log4j.properties en su CLASSPATH. El mejor lugar es en WEB-INF / classes.

También debe asegurarse de usar su versión de log4j.jar. Por lo tanto, colóquelo en WEB-INF / lib, solo para asegurarse de que no está utilizando uno de las carpetas de tomcat, ya que puede causar problemas de carga de clases extrañas.


Si no puede controlar la ruta de clase, ya que Tomcat la está configurando, ¿al menos puede establecer una propiedad del sistema para log4j.configuration ? Creo que la ubicación señalada por esa propiedad se puede establecer fuera de la ruta de clases.

De lo contrario, otro enfoque, aunque desagradable, sería ejecutar explícitamente uno de los configuradores en el código de la aplicación.


Tomcat 8.5

Ditto Tomcat 8.0.

Consulte la documentación: CÓMO ACTUAR con Loader de clase .

Tomcat 8.0

La respuesta es simple, tomada de la página de documentación de Tomcat, Class Loader HOW-TO . En particular, tenga en cuenta el uso de la carpeta /WEB-INF/ directorio / /WEB-INF/ .

Por lo tanto, desde la perspectiva de una aplicación web, la carga de clases o recursos se ve en los siguientes repositorios, en este orden:

  • Clases de Bootstrap de su JVM
  • /WEB-INF/classes de tu aplicación web
  • /WEB-INF/lib/*.jar de su aplicación web
  • Clases del cargador de clases del sistema (descritas arriba)
  • Clases comunes de cargador de clases (descritas arriba)

Si el cargador de clases de la aplicación web está configurado con <Loader delegate="true"/> entonces el pedido pasa a ser:

  • Clases de Bootstrap de su JVM
  • Clases del cargador de clases del sistema (descritas arriba)
  • Clases comunes de cargador de clases (descritas arriba)
  • /WEB-INF/classes de tu aplicación web
  • /WEB-INF/lib/*.jar de su aplicación web

Tomcat 6

Extraído de Tomcat 6 páginas, Class Loader HOW-TO .

Por lo tanto, desde la perspectiva de una aplicación web, la carga de clases o recursos se ve en los siguientes repositorios, en este orden:

  • Clases de Bootstrap de su JVM
  • Clases del cargador de clases del sistema (descritas arriba)
  • /WEB-INF/classes de tu aplicación web
  • /WEB-INF/lib/*.jar de su aplicación web
  • $CATALINA_HOME/lib
  • $CATALINA_HOME/lib/*.jar