2009-02-16 18 views
6

Quiero compilar varios archivos Java en mi aplicación sin reiniciar Weblogic y Tomcat. De lo contrario, esto lleva mucho tiempo. Para esto obtuve uno Hotswap plugin in Eclipse, pero esto no funciona en todos los casos. Dice que funciona para la compilación de un solo archivo. Incluso si uso eso, no está funcionando en todos los casos.¿Cómo compilar archivos java individuales/múltiples sin reinicio del servidor? ¿Hay algún complemento de Eclipse para el mismo?

¿Hay alguna otra manera de que pueda hacer esto o hay algún otro plugin/script/software que pueda ayudarme en esto?

Si hay algunas de código abierto, será de gran ayuda.

Gracias de antemano.

Respuesta

7

Una cosa es compilar las clases, pero también necesita la máquina virtual JAVA para volver a cargar las clases y usarlas, lo que se denomina intercambio en caliente. Para obtener el mejor intercambio de clases en caliente, necesitará algo como javarebel. Le permite cargar en caliente mucho más types of code-changes que la SUN JVM normal. Si ejecuta su implementación en modo explosión, estará en su casa libre y puede probar cualquier cambio de código en un segundo más o menos. Estamos bastante motivados por las pruebas, así que solo uso javarebel en esa fase corta cuando ensamblo toda la aplicación, pero funciona realmente bien.

+0

Gracias. Creo que Java Rebel parece ser bueno. Tengo que probarlo. Lo único que me preocupa es que no es un freeware/código abierto. ¿Sabes algo más que es freeware/OpenSource? En caso de que su respuesta sea No, ¿qué tan bueno es permitirse el lujo de Java Rebel? – Techmaddy

+0

No hay otras alternativas * reales * a partir de la jdk actual. Javarebel funciona bien para mí, pero eso es casi una pregunta separada por sí misma para responder. No es caro y sí, vale la pena. – krosenvold

1

No sé Eclipse, pero sí uso Netbeans. Netbeans lo hace bastante bien. La última versión incluso tiene una opción para recompilar automáticamente cuando guardas un archivo java.

Sé que esto no responde exactamente a su pregunta. Probablemente pueda usar tanto Netbeans como Eclipse dependiendo de en qué parte del proyecto esté trabajando.

EDITAR: Con Tomcat puede volver a cargar la aplicación web. Esto es realmente útil solo si Tomcat está mirando la nueva clase. Si su proyecto se compila primero en un directorio de compilación y luego se crea una GUERRA, puede acceder a Tomcat e instalar la aplicación web y en lugar de señalar un punto de WAR en el directorio de compilación.

En Tomcat es posible que deba colocar un archivo de configuración del sitio en tomcat/conf/Catalina/localhost. El contenido de este archivo es como sigue:

<?xml version="1.0" encoding="UTF-8"?> 
<Context docBase="C:/Projects/MyWebApp/build/web" path="/MyWebApp"/> 

instrucciones para volver a cargar aquí: http://www.cs.ucl.ac.uk/teaching/java/tomcatfaq.html#changeservlet

Si hace esto un par de veces, aunque Tomcat se quedará sin memoria. Esto se debe a algo llamado PermGenSpace. Lea sobre esto si quiere saber más. La solución es aumentar la memoria JVM, PermGenSize (con -XX: MaxPermSize) y finalmente reiniciar Tomcat ocasionalmente.

EDIT2: Si al volver a cargar la aplicación hace que se cierre la sesión, puede obtener fácilmente el contenedor para serializar los datos de la sesión en el disco agregando 'implementa Serializable' a algunas de sus clases. Entonces no deberías necesitar iniciar sesión después de volver a cargar la aplicación.

+0

No puedo cambiar a Netbeans. Sería genial si esto se puede hacer en Eclipse. – Techmaddy

0

Supongo que realmente no veo dónde está el problema. Esto es lo que hago y los cambios se cargan casi instantáneamente. Tengo un script Ant que compila los archivos .java y .jsp para mí, los coloca en los directorios apropiados bajo webapps y cambia el archivo web.xml si es necesario (o al menos lo toca para notificar a tomcat de los cambios). Si necesitas ayuda para hacer algo con Ant, estaré encantado de ayudarte. Por cierto, no uso archivos WAR para su implementación en mi máquina de prueba. Eso sería mucho más lento, supongo.

1

Estoy de acuerdo en que es muy tedioso volver a desplegar todo el tiempo cuando se desarrolla.

Le sugiero que busque en MyEclipse, que tiene un mecanismo de despliegue en caliente muy bueno que funciona bien con Tomcat, y que es bastante asequible y tiene una versión de prueba de 30 días.

El mecanismo de inventario de Java EE en Eclipse para volver a implementar servidores no es tan rápido.

2

La Java HotSpot VM hace esto automáticamente, pero no en todos los casos ...

En primer lugar, debe estar ejecutando una sesión de "depuración", no una sesión de "funcionamiento".

A continuación, algunos cambios obligarán a reiniciar. La idea básica es que si cambia la interfaz de la clase (el método sigs, no una interfaz real de Java), la VM no puede reemplazar el contenido de la clase en línea.

No necesita un complemento para esto, solo una máquina virtual reciente.

Esto sucede en diversas circunstancias como

  • métodos añadiendo
  • métodos eliminación
  • cambiantes firmas de método
  • cambiantes la jerarquía de clases (superclases, interfaces implementadas)

Se puede también sucede si introduce un error en la clase. (Para errores como llaves no coincidentes)

Cuando guarda un archivo Java, eclipse lo compila. Si hay un error, eclipse inserta un lanzamiento de excepción para indicar que hay un error de compilación no resuelto. (Para ello, por lo que cuando se ejecuta no acaba de ver la última compilación correcta, por lo que es obvio que tiene un error del compilador)

+0

Este me salvó, parece que es suficiente para iniciar Tomcat en modo de depuración. +1 –

Cuestiones relacionadas