2011-06-13 20 views
16

Quiero poder implementar cambios de código en Tomcat (casi al instante), mientras desarrollo en Eclipse.Despliegue cero cambio de Tomcat y Eclipse

Hasta ahora, tengo mi salida de Eclipse colocación de las clases incorporadas en la carpeta WEB-INF/classes de mi aplicación web.

que también tienen un contexto recargable, con el web.xml visto como un recurso. Cualquier edición/guardar en este archivo hace volver a cargar mi aplicación web, tardando poco más de un segundo, mucho más rápido que crear un nuevo archivo war e implementarlo por completo.

Sin embargo, lo que me gustaría hacer es desencadenar la reimplantación cuando edito cualquier archivo fuente. Como los archivos .class están siendo modificados en Tomcat, parece que solo necesito monitorear cualquier cambio en la carpeta WEB-INF/classes y son hijos.

He leído que puedo agregar recursos vistos adicionales en Tomcat's context.xml pero esto no parece ser todo lo que necesito, a menos que sea posible especificar un directorio que se verá (incluido el seguimiento recursivo de subcarpetas y archivos)?

<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>WEB-INF/someother.file</WatchedResource> 
    <Manager pathname=""/> 
</Context> 

Así que, esencialmente, mi pregunta se puede ver que toda la carpeta de clases (sin incluir cada WatchedResource explícitamente) para desencadenar una redeploy en Tomcat?

Si no, ¿puedo configurar Eclipse en touch el archivo web.xml, siempre que guardo un archivo fuente en ese proyecto? Estoy desarrollando en un sistema Windows. :(


PS No estoy interesado en el producto JRebel. Cualquier respuesta debe ser una solución libre.


actualización

De acuerdo con el Tomcat documentation, la carpeta de clases se debe supervisar configurando el contexto como recargable:

establece en true si desea Catalina a clases de monitor en/WEB-INF/classes/ y/WEB-INF/lib para cambios, y recarga automáticamente la aplicación web si se detecta un cambio.

Solo parece que los cambios en el web.xml provocan una recarga. ¿Es esto un error o mi configuración es incorrecta?

Además, he leído acerca de cómo establecer el atributo docBase para un contexto determinado:

docBase="webapps/someExample" 

Esto parece estar cerca de lo que necesito, ya que entonces podría publicar en Eclipse rápidamente. Mi único problema es que necesito varias aplicaciones web/servlets para ejecutar simultáneamente en Tomcat, en el mismo puerto, etc.

Respuesta

5

Para estos casos, establecí el resultado de construcción de eclipse en WEB-INF/classes como lo hizo y creo un archivo de contexto con docBase configurado en la carpeta webapp (principal de WEB-INF) en el proyecto. Esto se coloca manualmente en conf/Catalina/localhost (asumiendo configuraciones predeterminadas para algunos elementos de server.xml). El resultado final es que tomcat termina sirviendo desde el directorio de desarrollo. Por lo tanto, cambie un servlet u otra clase y se actualice a la carpeta de clases. Guarde un jsp y está disponible de inmediato.

Si el proyecto estructurado como:

src 
|-main 
    |-webapp 
    |-images 
    |-js 
    |-WEB-INF 
     |-jsp 
     |-classes 

Entonces contexto sería como:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/path" reloadable="true" 
    docBase="<pathtoproject>/src/main/webapp" /> 
+0

¿Sabes si hay alguna forma de hacer esto con múltiples aplicaciones web que se ejecutan en Tomcat? (Solo uno debe estar en la ruta de 'compilación de salida') – Mikaveli

+0

No estoy seguro de que te sigo. ¿Tiene proyectos web múltiples e independientes con los que desea comportarse de la misma manera durante el desarrollo? O bien, ¿tiene varios proyectos web que utilizan la misma biblioteca compartida y desea que la biblioteca compartida se compile en una carpeta de clases de proyectos web? Si los proyectos son independientes, solo necesita un archivo de contexto por proyecto (nombre el archivo .xml). Si los proyectos usan el mismo código compartido y quieres que se compile en la carpeta de clases web, no estoy seguro de cómo lo harías. – philwb

+0

Tengo varias aplicaciones web que deben ejecutarse en la misma instancia de Tomcat; no necesito el mismo comportamiento de "implementación en caliente" de ellas. – Mikaveli

2

¿Quizás el Proyecto de Herramientas Web de Eclipse con habilitación automática de redes habilitadas lo ayudará? Agregue un servidor, abra propiedades y en Publicación verá un botón de radio que dice "Publicar automáticamente cuando los recursos cambian".Esto dará lugar a una nueva implementación si las clases cambian, de lo contrario solo sobrescribe los recursos. Puede instalar WTP a través de un sitio de actualización integrado (solo Eclipse), así que consulte sus actualizaciones de software. ¿Es gratis para la mayoría de los servidores, pero no es compatible con ciertas características de Websphere?

+0

Ya estoy usando WTP. Una republica completa de mi proyecto tomaría minutos, eso es lo que trato de evitar. – Mikaveli

+0

¿Es debido a redesplegarse lleva tanto tiempo? Me refiero al reinicio del contexto del servlet y el calentamiento de los cachés (primavera, etc.) lleva tiempo. ¿O qué está tomando tanto tiempo? – toomasr

+0

Debido a que hay tantas clases y archivos, la construcción en Eclipse lleva años limpiar y volver a publicar. Si modifico las clases a medida que avanzo, entonces simplemente vuelva a cargar el contexto, esto es _much_ más rápido. Además, mira mi actualización. Gracias. – Mikaveli

0

Prueba el agente por resorte JVM que he descrito en la siguiente respuesta: https://stackoverflow.com/a/37064672/1034436

Si bien eso ha funcionado para mi aplicación web Spring, esto debería funcionar con vail Eclipse + WTP + Tomcat + Dynamic Web Applicatio ns ya que Spring Loaded funciona en el nivel JVM/classloading.

Deberá seguir utilizando "Publicar automáticamente cuando cambien los recursos", tal como lo menciona @toomasr en su respuesta. Sin embargo,, también debe desactivar la opción "Módulo auto recargar por defecto" también. Si ya ha agregado/publicado módulos de Eclipse a Tomcat, deshabilite "Recargar automáticamente" para cada módulo web (a través de la pestaña Módulos de la página de configuración de Tomcat). Eso debería evitar que Tomcat vuelva a cargar la aplicación cuando se actualice un solo archivo de clase, que sospecho es el tiempo de recarga/espera.

Cuestiones relacionadas