java - working - tomcat-users.xml tomcat 8
¿Reiniciar tomcat cuando se cambia un archivo de clase? (9)
¡Ciertamente hay! Inicie Tomcat en modo de desarrollo, luego cada aplicación web se reiniciará al volver a implementarse.
De los documentos de Tomcat:
El servlet que implementa Jasper se configura utilizando los parámetros init en su $ CATALINA_BASE / conf / web.xml global.
...
desarrollo - ¿Jasper se usa en modo de desarrollo (verificará la modificación de JSP en cada acceso)? verdadero o falso, predeterminado verdadero.
Hay configuraciones que puede cambiar para ajustar qué busca exactamente Tomcat para buscar actualizaciones. Usualmente despliego archivos de clase individuales a su directorio apropiado bajo WEB-INF/classes
y luego
touch WEB-INF/web.xml
para poner en marcha un reinicio de la aplicación; Creo que web.xml
es uno de los archivos que Tomcat revisa de forma predeterminada.
¿Por qué tenemos que reiniciar un servidor Tomcat cada vez que se cambia un archivo de clase, no hay otra manera?
Además de establecer autoDeploy = true en server.conf, también debe tener cuidado de no colocar ninguna clase en el cargador de clases compartido. Las clases cargadas por el cargador de clases compartido no se pueden volver a cargar.
Echa un vistazo a JRebel .
En una nota más general, la razón por la que tiene que hacer esto es porque en Java, cuando un cargador de clases carga una clase, no puede descargarla. Lo que Tomcat tiene que hacer es usar un nuevo cargador de clases y volver a cargar todas las clases que necesita.
Puede usar las herramientas JRebel. Ver ejemplo en mi blog http://przemek-nowak.pl/2010/10/jrebel-czyli-jak-przyspieszyc-prace-programisty/ . El ejemplo se refiere a Tomcat 6.0
Si desarrolla, su IDE debería poder hacer esto de forma transparente en un servidor adecuado. Por ejemplo, el Proyecto web dinámico en Eclipse sabe cómo hablar con Tomcat.
Si implementa, cree archivos WAR e impleméntelos. Tomcat sabe cómo volver a implementar un archivo WAR.
Si está utilizando archivos WAR para implementar, puede establecer autoDeploy=true
en la configuración de Tomcat, que hace que Tomcat observe la raíz de la aplicación web ("webapps" de forma predeterminada) para archivos WAR nuevos o modificados. Si se encuentra un archivo de este tipo, se implementa automáticamente.
Sin embargo, como dijo Pascal Thivent, puede usar la aplicación Tomcat Manager (/ manager / html) para iniciar, detener, implementar y anular la implementación de aplicaciones específicas. Si los archivos que está cambiando están en una aplicación específica, esta es una buena manera de que Tomcat reconozca los cambios.
Su pregunta en realidad no dice si le preocupa un tiempo de inactividad de producción (es decir, si lo reduce volviendo a cargar las clases) o si desea un desarrollo continuo. Entonces intentaré aclarar usando los siguientes puntos:
1) usando <Context reloadable=true...
en su directorio catalina.home/conf
puede asegurarse de que su aplicación web se recargue cuando cambie cualquier clase. Puede agregar la lista de vigilancia de cambio de recurso en el elemento <WatchedResources>
.
2) Pero esto volverá a cargar el contexto, reinicializará el cargador de clases, vaciará su caché y todo será como si la aplicación weba acabara de comenzar.
Este enfoque aún dejará inutilizable su servidor, porque ha vuelto a cargar el contexto del Servlet. El verdadero "Recargar" es
1) Cambia el código de bytes de la clase, con algunas restricciones 2) JVM devolverá esa clase cuando se llame a "loadClass ()" para ese cargador de clases.
Esta es la instrumentación de Java. Puede escribir su propio agente que puede engancharse en su JVM, ya sea al principio o en vuelo. Sin embargo, no puede definir un nuevo método y cambiar las variables estáticas. Estas son restricciones nativas de JVM (para Oracle HotSpot JVM, que yo sepa). Puede usar una JVM diferente, por ejemplo, DCEVM, que no tenga dicha restricción. Depende de usted cómo quiere manejar su problema. Si sabe lo que está haciendo (!), Puede salirse con la suya reemplazando las clases una a una. E incluso puede definir una "Clase nueva", hacer referencia a ese objeto / método de clase en una clase existente / cargada e instrumentarlo para recoger los cambios.
Espero que esto ayude. Todas las respuestas aquí son lo que necesita para tomar su decisión.
Puede configurar Tomcat y hacer que su aplicación web sea "recargable". Para hacerlo, agregue reloadable=true
al elemento <Context>
de su aplicación web. Acerca del atributo reloadable
, la documentation dice:
Establézcalo en
true
si desea que Catalina supervise las clases en/WEB-INF/classes/
y/WEB-INF/lib
para ver los cambios, y recargue automáticamente la aplicación web si se detecta un cambio. Esta característica es muy útil durante el desarrollo de aplicaciones, pero requiere una sobrecarga significativa en el tiempo de ejecución y no se recomienda su uso en aplicaciones de producción implementadas. Es por eso que la configuración predeterminada para este atributo es falsa. Sin embargo, puede utilizar la aplicación web Manager para desencadenar recargas de aplicaciones implementadas a pedido.