Integración de tomcat y eclipse como entorno de implementación en caliente

88

Me gustaría configurar eclipse y tomcat de manera integrada, de modo que los cambios en mis JSP y servlets (si es posible) se reflejen inmediatamente sin requerir una implementación.

Bien, esta es una de esas preguntas que tiene muchas respuestas en Internet, pero todas parecen diferentes. (use el complemento Sysdeo, use el complemento JBOss, haga cosas con un Eclipse desactualizado, use MyEclipse en su lugar, etc.) y no pude encontrar 1 recurso definitivo para referirme. Entonces, para mi beneficio, ¿cuál es el procedimiento más simple y recomendado para configurar esto?

Esto supone que tengo eclipse y tomcat ejecutándose de forma independiente. De hecho, me las arreglé para integrarlos de una manera no implementada en caliente usando las instrucciones aquí: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Versión de Eclipse Versión: 3.4.2 (Ganymede) Tomcat v6.0.20

udit
fuente
17
Cuatro años después, me desconcierta el hecho de que sigue siendo un problema. Vamos, es bastante fundamental.
Konrad Garus
7 años después (casi), creo que he descubierto una solución: stackoverflow.com/a/37064672/1034436
martian111

Respuestas:

75

Hay dos opciones.

Primero, Eclipse le permite hacer esto, con un ligero cambio de configuración (vea también esta publicación detallada )

  • agregar Tomcat a la lista de servidores
  • hacer que el proyecto sea "Proyecto web dinámico" (ya sea a través del asistente de creación o mediante la sección de facetas en la configuración)
  • agregue el proyecto a tomcat y configure su "Ensamblado de implementación"
  • haga doble clic en tomcat de la lista para abrir las configuraciones
  • Cambie "Publicar" a "Nunca publicar automáticamente" (esto significa que el servidor no se reiniciará cuando presione ctrl + s)
  • iniciar tomcat en modo de depuración

Esto seguirá reflejando los cambios de código pero no reiniciará el servidor.

En segundo lugar, he usado el complemento FileSync durante mucho tiempo:

  • configure el complemento para enviar todas las clases desde el director de bin a WEB-INF/classessu instalación de tomcat (esto es casi lo mismo que configurar el ensamblaje de implementación)
  • configurar todos los demás recursos para ir a sus respectivas ubicaciones
  • opcionalmente, externalice todas las rutas absolutas desde la configuración de ubicación de sincronización de archivos a una sola variable y configure esa variable en eclipse (por lo tanto, también podrá confirmar la configuración de sincronización de archivos, si todos los miembros están usando eclipse)
  • agregue Tomcat a la lista de servidores en eclipse, configure la opción "Ubicaciones de servidor" para que sea "Usar instalación de tomcat" (la pantalla se abre cuando hace doble clic en tomcat desde la lista de servidores)
  • iniciar tomcat en modo de depuración

Funciona perfectamente para mí de esa manera. Cada cambio no estructural se refleja de inmediato, sin redistribución.

Actualización:
puede leer más sobre los métodos de implementación en caliente aquí .
También creé un proyecto que sincroniza fácilmente el espacio de trabajo con el contenedor de servlets.

Bozho
fuente
@VladimirTsvetkov no - estas son dos opciones separadas
Bozho
Estoy intentando su primer enfoque, pero estoy usando Maven Overlays y cuando cambio un archivo en una de las superposiciones, el servidor aún se reinicia (la superposición no es un proyecto web dinámico sino un módulo web dinámico). ¿Algunas ideas?
Hoffmann
2
Tengo la impresión de que al cambiar "Publicar" a "Nunca publicar automáticamente", las JSP ya no se vuelven a cargar / recompilar cuando se modifican. La parte de recarga de clases funciona bien al iniciar Tomcat en modo de depuración.
yglodt
5
Lo hago de otra manera: primero, cambio para publicar automáticamente; segundo, haga clic Modulesen la pestaña en la configuración del servidor, luego haga clic en edit, desmarque auto deploy enabled, creo que esta es la forma más sencilla. PD: tu primera forma no me funciona.
hiway
@hiway, ¿dónde está esta pestaña de Módulos dentro de la pestaña de configuración del servidor?
Mateus Viccari
30

Simplemente deje que eclipse escriba los archivos de clase directamente en el directorio $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Luego, configure apache-tomcat para verificar si los archivos de clase se han actualizado y vuelva a cargarlos si es así.

Para configurar Tomcat para que recargue automáticamente una clase cuando cambie, debe

editar $TOMCAT/conf/context.xmly configurar:

<Context reloadable="true"> 

También puede que tenga que editar y volver a cargar su webapps/$YourWebApp/web.xmlarchivo e incluir:

<web-app reloadable="true">

No recuerdo si se necesitan ambos cambios, pero así es como configuré mi tomcat-6.0.18 para que se recargue automáticamente.

Martin Tilsted
fuente
De acuerdo con la documentación, tomcat.apache.org/tomcat-6.0-doc/config/context.html recomiendan no colocar Contextelementos en el archivo server.xml, pero debería monitorear / WEB-INF / classes / y / WEB-INF / lib para cualquier cambio. ¿Dónde leíste sobre el atributo del web-appelemento?
Michael
Lo siento, malinterprete un poco su respuesta. El context.xml "debe cargarse para cada aplicación web".
Michael
2
¿Cómo se configura dónde escribe Eclipse los archivos de clase?
yglodt
7

Descargo de responsabilidad : solo soy un cliente feliz, no trabajo para Zero Turnaround y de ninguna manera estoy afiliado a ellos.

Consulte JRebel : le permite codificar sin reiniciar la aplicación web. Básicamente, funciona instrumentando tus clases y adaptando sus cambios. Maneja muchos más casos que la implementación en caliente , que incluyen:

  • Agregar / eliminar métodos
  • Agregar / eliminar constructores
  • Cambiar interfaces
  • Agregar / eliminar interfaces implementadas

Es comercial ( detalles de precios , $ 550 / año a junio de 2018) y tiene muchos complementos para marcos de terceros, que incluyen:

  • Guice
  • Primavera
  • Puntales 2

Obtienes una prueba gratuita sin dolor; te sugiero que la pruebes.

Robert Munteanu
fuente
2
Jrebel, cuando funciona, funciona. Cuando no lo hace, es una pesadilla. Me he estado golpeando la cabeza con su apoyo durante más de una semana y todavía no puedo hacer que funcione en mi configuración simple de mvc de primavera. No ayudarán más sin que les envíe mi aplicación o un helloworld de mi aplicación. Y sus precios están desactualizados: ahora cobran una bomba. Gracias a Dios solo usé su versión de prueba
happybuddha
El precio actual es de $ 365 / año / asiento
Joseph Lust
Y ahora sus $ 550 / año / asiento
frewper
3

Cambie su espacio de trabajo en Eclipse a \ tomcat \ webapps Ya que es solo para su trabajo, esto debería funcionar bien. Cualquier cambio que realice en Eclipse se encuentra en el mismo directorio que Tomcat busca aplicaciones para implementar.

PaganSensei
fuente
3

En la vista de servidores, cree un nuevo servidor, no agregue ningún recurso (proyecto) al servidor todavía. Haga doble clic en el servidor en la ubicación de los servidores. Elija "Usar instalación de Tomcat". Modifique "Ruta de implementación" en el directorio de implementación de Tomcat (por ejemplo: c: \ server \ Tomcat 7.0.14 \ webapps). Amplíe la "Sección de publicación". Marque "Publicar automáticamente después de un evento de compilación". Guardar y cerrar. En el menú de eclipse, marque "Proyecto -> Construir automáticamente". Desde la vista de servidores, haga clic derecho en su servidor, "Agregar y quitar", publique su proyecto.

ticu0000
fuente
2

¿Por qué no utilizar un servidor Tomcat integrado en eclipse si esto es solo para desarrollo? Puede configurar servidores en ventana-> preferencias. Una vez que está configurado, si tiene un jsp llamado page.jsp, puede hacer clic con el botón derecho y seleccionar ejecutar en el servidor. En preferencias-> general-> navegador web, puede elegir el clima para usar el navegador integrado o uno externo. Realice algunos cambios en su jsp, guarde y actualice su página desde el navegador. Los cambios se reflejarán automáticamente una vez que guarde y actualice su navegador.

Jared
fuente
2

Lo que me funciona aquí es:

context.xml así:

<Context path="/myapp" docBase="myapp" debug="5"
    reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
    <Loader     loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />

</Context>

Luego, en la pestaña Servidores en Eclipse, en la pestaña "Módulos", desactivé la "Recarga automática" para todos los módulos que se están implementando.

También deje que la configuración predeterminada permita la publicación automática.

Y está usando Maven con WTP, no olvide dejar el contenido de src / main / resources, porque Eclipse insiste en excluir el contenido de esta carpeta de la compilación final.

¡Solo con todo esto obtuve clases completas (VM) de implementación en caliente con recursos de implementación en caliente!

tirado
fuente
1

En su entorno de desarrollo, simplemente apunte su servidor Tomcat para buscar JSP en cualquier directorio en el que los esté desarrollando. Tan pronto como guarde el archivo, podrá ver los cambios.

Cameron
fuente
1

Me las arreglé para que esto funcione en mi entorno de desarrollo utilizando el agente JVM Spring Loaded . Si bien desarrollo aplicaciones web Spring, la descripción de ese proyecto menciona que es

utilizable en cualquier código de bytes que pueda ejecutarse en una JVM

Usando la siguiente configuración, pude obtener cambios para publicarlos automáticamente en una instancia de Tomcat adjunta (el método habitual de Eclipse WTP). Estoy usando Spring Tool Suite 3.7.3 basado en Eclipse Mars.2 (4.5.2).

  1. Descargue el último lanzamiento JAR de Spring Loaded de su proyecto Github . Esto ha sido probado con springloaded-1.2.5.RELEASE.jar.
  2. Configure un servidor Tomcat en Eclipse como de costumbre (probado con Tomcat 8.0.30)
  3. Abra la página de configuración del servidor Tomcat en Eclipse (haga doble clic en la instancia del servidor dentro de la pestaña "Servidores").
  4. En la sección "Opciones del servidor", desmarque "Los módulos se recargan automáticamente de forma predeterminada".
    • Nota: Si ya ha agregado módulos web al servidor, es posible que deba deshabilitar la "Recarga automática" en ellos individualmente a través de la pestaña "Módulos" (en la parte inferior de la ventana de la página de configuración).
  5. En la sección "Información general", haga clic en "Abrir configuración de lanzamiento".
    • En la pestaña "Argumentos", agregue lo siguiente al final de los "Argumentos de la máquina virtual": -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Para permitir que se vean los .classarchivos JAR además de los archivos del proyecto , configure el -Dspringloaded=watchJars=argumento de VM según los comentarios de este problema .

Inicie el servidor y publique proyectos de aplicaciones web dinámicas en él como de costumbre. Nuevamente, pude probar esto con las aplicaciones web de Spring. Por ejemplo, la modificación de código, la adición / sustracción de métodos, etc. en las clases de @Controller se aplicaron casi instantáneamente después de guardar el archivo y Eclipse compila y publica la clase cambiada. Por último, la sección de preguntas frecuentes del proyecto Spring Loaded mencionó algunos casos en los que las cosas no se recargan, por lo que sería necesario reiniciar el servidor / aplicación. Pero esas excepciones son mucho menos frecuentes.

Una nota más: esto NO funciona con el servidor Pivotal tc integrado o el servidor VMware vFabric tc que viene con STS. Para esos servidores, hay una opción "Habilitar la recarga basada en el Agente Java (experimental)", pero usa la versión 1.2.0 anterior de Spring Loaded, que no me funcionó.

marciano111
fuente
Parece que debes asimilar Spring, ¿qué tal la Non Springaplicación?
Tangoo
Aunque necesita que SpringLoaded JAR esté configurado para Tomcat, las aplicaciones en ejecución en sí NO necesitan ser aplicaciones Spring (ni incluir ningún Spring JAR). Probé esto con éxito con un simple Servlet HelloWorld.
martian111
0

¿Está dispuesto a utilizar Jetty con fines de desarrollo?

Si es así, es bastante simple de usar con Maven, simplemente ejecute mvn jetty:run

mate b
fuente
0

Puede que esta no sea la mejor manera, pero me funciona.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / project-servlet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (debería exportar jar al directorio lib en $ contextPath)
  • $ eclipseWorkbench / project-jsp /

Utilizo un comando rsync para sincronizar los cambios de mi proyecto jsp con $ contextPath.

Utilice la depuración remota en Eclipse para Tomcat, que permitirá el intercambio en caliente limitado de código. Si cambia los campos estáticos o agrega métodos, deberá exportar el archivo jar y reiniciar el contexto.

TJR
fuente
0

¿Podemos usar la siguiente opción? Haga doble clic en Servidor en eclipse -> Ubicaciones del servidor -> Usar instalación de tomcat. Toma el control de la instalación de Tomcat. No es necesario reiniciar el servidor para cambios en las clases de Java.

Tushar Sagar
fuente
0

Encontré una forma más sencilla: uso de enlaces simbólicos: creo que esta es la forma más rápida porque no hay sincronización en absoluto: el directorio tomcat y el directorio de tu proyecto será el mismo directorio todo el tiempo.

Tomcat detectará periódicamente los cambios y volverá a implementar su aplicación.

También hay una forma de depurar tu aplicación, así que humildemente creo que es una buena solución.

He documentado mi solución aquí , para cualquier persona interesada.

Raul Luna
fuente
¿Puedo saber por qué es necesario usar la aplicación java remota ya que está usando localhost, lo que significa que estoy depurando usando mi propia máquina local?
Karen Goh
0

En caso de que tengas prisa:

  1. marque "nunca publicar automáticamente" en tomcat (otro contenedor) en eclipse.
  2. inicie tomcat (otro contenedor) en modo de depuración.

voila! :)

Sachin Verma
fuente
0

En Eclipse, haga clic en Proyecto en el menú superior y asegúrese de que esté seleccionado "Construir automáticamente". Esto solucionó mi problema. Estaba ejecutando Eclipse con Tomcat usando los metadatos de mi espacio de trabajo. También estaba ejecutando Maven en un proyecto de módulo web dinámico. Para verificar, agregue su aplicación a Tomcat. Inicie Tomcat desde Eclipse. Asegúrese de que su aplicación esté implementada y en ejecución. Abra la pestaña Consola en Eclipse. Realice un cambio en su aplicación. Después de un par de segundos, debería ver que su cambio se compila e implementa automáticamente en Tomcat.

NLessani
fuente
-2

Más simple, más rápido: configure Eclipse para generar un archivo WAR cuando construya; como paso posterior a la compilación, copie ese archivo WAR en su directorio de aplicaciones web de tomcat. Tomcat reconocerá el cambio y actualizará el sitio sin necesidad de implementación. Tenga en cuenta que esto no es perfecto; los usuarios que usan esa aplicación web pueden tener una experiencia menos que óptima, ya que Tomcat reinicia la aplicación web "debajo" de ellos; pero esto se ajusta a su solicitud.

Paul Sonier
fuente
1
ok ... supongo que no dejé claras mis intenciones. Realmente no estoy interesado en implementar la aplicación para algunos usuarios, pero estoy tratando de ejecutar un Tomcat con eclipse para mis necesidades de desarrollo diarias y acortar el ciclo de retroalimentación de (hacer cambio) -> (Ver resultado) en lugar de (Hacer Cambiar) -> Implementar -> (Ver resultado)
udit