sirve servlet que para paginas formulario ejemplos ejemplo desde cero aplicacion java tomcat configuration classpath

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



que es un servlet y para que sirve (4)

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:

<classpath>/usr/local/tomcat/custom-libs/zk-5.0.4</classpath>

Nota: Lo anterior es pseudo-código


Adición @Spider respuesta.

Tomcat Context hold Loader element. De acuerdo con el descriptor de implementación de Context (lo que en la etiqueta <Context> ) 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 <filtering>true</filtering> así que después de compilar en un nuevo entorno, lo copio en $CATALINA_BASE/conf/Catalina/localhost/$APP.xml ):

<Context docBase="${basedir}/src/main/webapp" reloadable="true"> <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html --> <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/> <Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/> <JarScanner scanAllDirectories="true"/> <!-- Use development version of JS/CSS files. --> <Parameter name="min" value="dev"/> <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/> <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/> </Context>

ACTUALIZACIÓN Tomcat 8 cambia la sintaxis de los elementos <Resources> y <Loader> , la parte correspondiente ahora se ve así:

<Resources> <PostResources className="org.apache.catalina.webresources.DirResourceSet" webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" /> <PostResources className="org.apache.catalina.webresources.DirResourceSet" webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" /> </Resources>


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:

<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/websandbox"> <Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="/usr/.../*.jar;/usr/.../*.jar"/> </Context>

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.


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 addUrl() 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: Loader )

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