IntelliJ y Tomcat ... Tomcat no reconoce automáticamente los archivos modificados

135

Estoy ejecutando Intellij Ultimate con Tomcat y desplego una guerra. Todo se despliega bien en el directorio webapp de tomcat.

Cuando cambio un archivo como un archivo xhtml, ¿hay alguna forma en que tomcat pueda recoger automáticamente ese cambio? A partir de ahora necesito copiar el archivo de Intellij y copiarlo en el directorio de donde vive en el directorio de aplicaciones web de Tomcat. Sé que hay ciertos archivos que necesitarán una recompilación, pero xhtmls no es uno de ellos.

Peter
fuente

Respuestas:

21

Permítanme describir la secuencia de acciones usando capturas de pantalla:

  1. Abra su configuración de ejecución / depuración de Tomcat (Ejecutar> Editar configuraciones)

ingrese la descripción de la imagen aquí

  1. Haga clic en el icono de agregar, seleccione 'artefacto' y luego seleccione pizza_mvc:war exploded: ingrese la descripción de la imagen aquí

  2. Modifique 'En acción de actualización' y 'En diactivación de marco': ingrese la descripción de la imagen aquí

  3. Cada vez que desee actualizar sus recursos, presione <Ctrl> + F10

Lord Nighton
fuente
Gracias por recordarme que verifique "En la acción 'Actualizar'"
km1
290

Esto no se puede hacer si despliegas una guerra con IntelliJ IDEA. Sin embargo, puede ser si despliegas una guerra explotada . En IDEA:

  1. abra la configuración de ejecución / depuración de Tomcat ( Ejecutar> Editar configuraciones )
  2. Vaya a la pestaña "Implementación"
  3. En la sección "Implementar en el inicio del servidor", elimine (si está presente) el artefacto my-webapp-name:war
  4. Haga clic en el icono de agregar, seleccione 'artefacto' y luego seleccione my-webapp-name:war exploded
  5. Haga clic en Aceptar (en el cuadro de diálogo "Seleccionar artefactos para implementar")
  6. Aún en la ventana de configuración de ejecución / depuración, seleccione la pestaña "Servidor"
  7. En el medio de esa pestaña, cambie la configuración de "Desactivación en el marco" a "Actualizar recursos" o "Actualizar clases y recursos"
    • Actualizar recursos: se actualizarán todos los recursos modificados (es decir, todos los componentes de la aplicación que no sean las clases).
    • Actualizar clases y recursos: se actualizarán todos los recursos modificados; las clases cambiadas serán recompiladas. Tenga en cuenta que si las clases reales se actualizarán depende de las capacidades del servidor web. Si mal no recuerdo, Tomcat volverá a cargar los archivos html / xhtml y jsp, pero no los Servlets o las clases que utilizan JSP o Servlets. Necesita modificar Tomcat para usar un cargador de clases dinámico para eso.
  8. También puede establecer la acción " En 'actualizar' " a la seleccionada anteriormente también.
    • Esto determinó lo que sucede cuando presionas el Icono de actualizaciónícono Actualizar (o Ctrl+ F10) en la ventana Ejecutar.
    • el "cuadro de diálogo Mostrar" determina si IDEA le solicita cada vez que pulse el icono de actualización
  9. Haga clic en Aceptar.

Ahora, cada vez que realice un cambio, IDEA volverá a implementar los archivos modificados cuando el marco de IDEA se desactive (es decir, pierde el foco). Tarda uno o dos segundos, lo verá en la barra de estado inferior en IDEA. Obviamente. aún necesitará actualizar su navegador web para que obtenga el nuevo archivo (a menos, por supuesto, si la página tiene una actualización automática de ajax como fetch).

Una buena combinación con Tomcat es establecer "Al desactivar el marco" en "Actualizar recursos" y la acción "Al actualizar" en "Volver a desplegar" o "Reiniciar servidor". Eso permite que las páginas estáticas se actualicen rápidamente mediante la desactivación de marcos, y clase actualizada a través de la acción 'actualizar'.

Una compañía llamada ZeroTurnaround vende JRebel, que es una solución dinámica de carga de clases. También tienen una serie de cinco partes sobre el tema que es muy buena.

Javaru
fuente
Tengo un error: Error: Artifact 'my-webapp-name:war exploded' has invalid extension¿cómo solucionarlo?
Anton Dozortsev
3
También recomiendo usar DCEVM para la recarga automática de clases. Luego puede usar "Actualizar clases y recursos" para aplicar cualquier cambio en el código fuente sin volver a implementar la aplicación. Ver: blog.jetbrains.com/idea/2013/07/… . Además de lo que explica este tutorial, es necesario establecer JAVA_HOME en la pestaña Configuración / Conexión - Depuración de la Configuración de ejecución de Tomcat para que apunte al JRE del DCEVM.
Alex Fedulov
1
@yaroslavprokipchyn: no estoy familiarizado con JBoss y los requisitos 'especiales' que pueda tener. Pero hasta donde yo sé, debería funcionar igual. Para tomcat, IDEA crea una configuración de Tomcat (context.xml) que le dice a Tomcat que use el directorio de destino / {contextName} como el directorio raíz de la aplicación web. Es posible que desee consultar la guía de ayuda para obtener información específica de JBOss.
Javaru
3
En el paso 7, no (al menos en Intellij 14) obtendrá las opciones desplegables apropiadas a menos que tenga todos sus artefactos cargados como "explotados".
mortensi
1
@ChiefTwoPencils: el paso 5 es hacer clic en Aceptar en el cuadro de diálogo "Seleccionar artefactos para implementar" (para el que no hay "aplicar"), no en la ventana de configuración Ejecutar / Depurar.
Agregué
12

Si desea actualizar clases y recursos, ejecute Tomcat en modo de depuración . En este modo, IntelliJ actualiza las clases y los recursos sin problemas (intercambio en caliente).

Tengo el mismo problema IntelliJ no actualizó mi proyecto, porque lo ejecuto como "Modo de ejecución". Cuando ejecuto el modo de depuración y presiono Ctrl+ F10, actualiza las clases y los recursos.

Łukasz Woźniak
fuente
Control-F10 solucionó el problema para mí. ¡Gracias!
Jeffrey Getzin
3

He encontrado una mejor manera.

En Eclipse hemos creado, compilado y recargado automáticamente archivos estáticos. En realidad, los archivos estáticos se sirven directamente desde src / main / webapp .

En IntelliJ en lugar de servir directamente desde src / main / webapp , hay una carpeta creada en target, en la que tendrá una copia de su src / main / webapp y también otro contexto relacionado ... web-inf / classes / lib.

Si coloca en lugar del destino la salida del artefacto explotado en src / main / webapp , no sobrescribirá sus archivos de origen, y servirá directamente, no tendrá que presionar - actualizar recursos / actualizar recursos y clases

Entonces, lo que debes hacer en IntelliJ es

  1. modificar el directorio de salida de artefactos explotados a src / main / webapp ingrese la descripción de la imagen aquí
  2. hacer una macro para guardar y recompilar / compilar clases sucias (cmd + shift + f9) ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí
  3. edite el registro y las preferencias para compilar automáticamente y compile mientras se ejecuta la aplicación (cmd + shift + a - registro). ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Después de esto, si tiene trabajos que cambian archivos estáticos desde fuera de IntelliJ, verá cambios inmediatamente sin ir a IntelliJ y Actualizar recursos , y para las clases que tiene esa macro que guarda y compila (Nota: también podría presionar Compilar / Recompilar: cmd + shift + F9 / cmd + F9: si tiene varios editores abiertos, verá que sus editores sucios * no estarán sucios y los cambios (clases) se volverán a cargar)

Radu Toader
fuente
Parece que si tiene el registro compiler.automake .. habilitado, empuja sus cambios solo presionando guardar también.
Radu Toader
0

Eso es posible solo cuando implementa la carpeta de guerra explotada, habilita la recarga en caliente e inicia tomcat en modo de depuración.

Estos son los pasos para lograr esto.

  1. abra la configuración de ejecución / depuración de Tomcat (Ejecutar> Editar configuraciones)
  2. Vaya a la pestaña "Implementación" 3.En la sección "Implementación en el inicio del servidor", elimine (si está presente) el artefacto my-webapp-name: war
  3. Haga clic en el icono de agregar, seleccione 'artefacto' y luego seleccione mi-nombre-aplicación-web: guerra explotada
  4. Haga clic en Aceptar (en el cuadro de diálogo "Seleccionar artefactos para implementar")
  5. Aún en la ventana de configuración de ejecución / depuración, seleccione la pestaña "Servidor"
  6. Cambie la configuración de "Desactivación de marco" y "Acción de actualización" a "Actualizar clases y recursos"
  7. Aplicar y guardar
  8. Vaya a la configuración normal de proyectos haciendo clic en Archivo y luego en Configuración O presionando CTRL + ALT + S
  9. goto "Compilación, ejecución, implementación"
  10. Compilador
  11. Seleccione Crear proyecto automáticamente
  12. salvar
  13. Inicie tomcat en modo de depuración
Adindu Stevens
fuente
0

Si tiene archivos múltiples que desea ver / reproducir de inmediato, cárguelos directamente en la carpeta de destino. * (solo cambia la ubicación de escritura a la carpeta de destino / static /)

String yourpath = C\\andSoForth
    yourPath + "\\target\\classes\\static\\uploads\\audiofiles\\"

podrá ver su archivo inmediatamente sin tener que reiniciar su IDE

Esther
fuente