2010-09-01 18 views
5

Estoy construyendo un sistema de actualización en el que necesito poder reemplazar un contenedor referenciado de un contenedor de aplicación en ejecución en tiempo de ejecución. Sin embargo, me estoy encontrando con problemas de bloqueo de archivos en Windows cuando intento realizar funciones de utilidad de archivos en el contenedor como 'setLastModified'.Intercambio de un contenedor en ejecución en el tiempo de ejecución

Después de algunas google me encontré con este fragmento ...

Lo que encontré en mi investigación es que el estándar de cargador de clases aplicación nunca se cierra un archivo jar una vez que se ha abierto. También solo carga recursos del archivo jar según sea necesario. Por lo tanto, en cualquier momento particular, , puede haber clases en el archivo jar que no se hayan cargado en la memoria. Obviamente, si elimina el archivo jar de debajo del ClassLoader, y intenta encontrar un recurso en el archivo que falta , obtendrá una IOException como mínimo.

¿Alguien tiene alguna referencia a información sobre cómo hacerlo o sobre cómo solucionar este problema?

Gracias.

+0

¿Necesita reinventar la rueda? OSGi ya tiene una implementación en caliente. Eche un vistazo y vea si puede usar eso en su lugar. – SteveD

+0

OSGi suena abrumador para la mayoría de los requisitos, eche un vistazo a esta respuesta http://stackoverflow.com/a/2463978/320594 –

+0

Después de volver a leer, parece que desea mantener su aplicación en ejecución, pero con los nuevos tarros ... entonces OSGi realmente parece una buena solución :), por ejemplo, Eclipse lo permite (los complementos se vuelven a cargar durante la ejecución) y usa OSGi para eso (mientras yo sepa). –

Respuesta

5

Hay una gran cantidad de soluciones para las clases/lib intercambio en caliente:

Depende de lo que quiere hacer.

+2

OSGi es enorme y JRebel solo es para desarrollo, ya que requiere una licencia cara (gratuita para proyectos OSS). No estoy seguro de Hotswap para hormiga – TheLQ

2

Lo más parecido es OSGi

Por favor, echar un vistazo a la sección 'Ver también' de la artice mencionada para productos de hormigón.

0

No conozco ninguna buena manera de lidiar con esto. La creación de un cargador de clases personalizado podría ser una opción, aunque no me gusta esa idea ...

Hemos trabajado en ello ejecutando un actualizador desde un contenedor separado antes de iniciar la aplicación principal. Esto funciona bastante bien, pero obviamente, solo puede actualizar el jar cuando se inicia la aplicación.

Cuestiones relacionadas