¿Puedo crear una ruta de clases personalizada por aplicación en Tomcat

Para algunas aplicaciones utilizo ZK, otras Hibernate, otras Apache Commons, etc.

No quiero implementar un archivo war de 75MB, solo porque usa muchas bibliotecas.

No quiero agregar las bibliotecas a mi carpeta lib de tomcat, ni tampoco la ruta de clases a su configuración, ya que puedo tener una aplicación anterior que usa la biblioteca x.1 y otra aplicación que usa la biblioteca x.2

Por esta razón, sería genial tener algo en el web.xml o context.xml donde diga algo como:

/usr/local/tomcat/custom-libs/zk-5.0.4 

Nota: Lo anterior es pseudo-código

De Tomcat 7 no se menciona que no se pueda usar VirtualWebappLoader en producción. Lo intenté y funciona como un sueño. Simplemente agregue lo siguiente a META-INF / context.xml:

     

En Netbeans, en el paquete, simplemente desinscribo todos los paquetes, reduciendo el tamaño .war a nada, asegúrate de que las dependencias estén en las carpetas correctas en el servidor y cárgalas. ¡Yey! No más de 100 MB de archivo WAR.

Adición @Spider respuesta.

Tomcat Context hold Loader element. De acuerdo con el descriptor de implementación de documentos (lo que en la etiqueta ) se puede colocar en:

  • $CATALINA_BASE/conf/server.xml – bad – require server reinicia para volver a leer config
  • $CATALINA_BASE/conf/context.xml – malo – compartido en todas las aplicaciones
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml – bad – requiere reempaquetado para cambiar las configuraciones
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml – ¡¡¡ bien , pero mira la última opción !!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml – ¡ $CATALINA_BASE/webapps/$APP/META-INF/context.xml , pero mira la última opción!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml – lo mejor – completamente fuera de aplicación y escaneado automáticamente en busca de cambios.

Aquí mi configuración que demuestra cómo usar la versión de desarrollo de los archivos de proyecto fuera de la jerarquía $CATALINA_BASE (tenga en cuenta que coloco este archivo en el directorio src/test/resources e instalo Maven para preprocesar marcadores de posición ${basedir} través de pom.xml true así que después de comstackr en un nuevo entorno, lo copio en $CATALINA_BASE/conf/Catalina/localhost/$APP.xml ):

           

ACTUALIZACIÓN Tomcat 8 cambia la syntax de los elementos y , la parte correspondiente ahora se ve así:

     

Otra alternativa un poco hacky.

Puedes escribir un cargador de clases personalizado de 5-6 líneas que se deriva de urlclassloader , y simplemente agrega tus jar de classpath usando el método addUrl () .

A continuación, configúrelo como el cargador de clase de contexto del subproceso en el código de su aplicación.

 Thread.setContextClassLoader(new CustomClassloader(path, parentClassLoader) 

donde el cargador de clases padre es típicamente

 Thread.getContextClassloader() 

Para esto se puede usar el archivo META-INF / context.xml. Usted definió su propio WebappLoader, que carga clases para su aplicación web particular. Esta es la referencia que utilicé: http://tomcat.apache.org/tomcat-5.5-doc/config/loader.html (Editar: para Tomcat 6: http://tomcat.apache.org/tomcat-6.0-doc /config/loader.html , para Tomcat 7: http://tomcat.apache.org/tomcat-7.0-doc/config/loader.html )

También este tipo aquí parece publicar una solución a su problema exacto (ejemplo incluido): http://java.dzone.com/articles/extending-tomcat-webapploader

    Intereting Posts