2012-04-20 14 views
24

Problema: Tengo una aplicación independiente de Java (en adelante, "el agente") que se ejecuta como un servicio en los servidores internos de la empresa. Actúa como un agente remoto para algunos servidores centrales. A medida que el agente se despliega en más lugares, gestionarlos se vuelve cada vez más complicado. Específicamente: empujar las actualizaciones es doloroso porque es un proceso bastante manual, y obtener acceso a los registros y otra información sobre los entornos en los que se ejecutan los agentes es problemático, lo que dificulta la depuración. Los servidores en discusión son sin cabeza y sin supervisión, lo que significa que tiene que ser un proceso totalmente automático sin intervención manual, por lo tanto, Java Web Start no es una solución viable.¿Cómo puedo hacer que una aplicación Java se actualice automáticamente?

Solución propuesta: Poner el teléfono del agente en casa (a los servidores centrales) periódicamente para proporcionar el estado del agente y comprobar si hay actualizaciones.

Estoy abierto a otras soluciones sugeridas para el problema, pero ya tengo un prototipo funcional para la idea de "estado y actualizaciones automáticas", que es en lo que se centra esta pregunta.

Lo que se me ocurrió es en realidad un proyecto separado que actúa como un contenedor para el agente. El contenedor periódicamente llama al servidor central a través de HTTP para buscar una versión actualizada del agente. Al encontrar una actualización, descarga la nueva versión, apaga el agente en ejecución e inicia el nuevo. Si eso parece una solución par o rotonda, aquí hay algunas otras consideraciones/restricciones pena señalar:

  1. Cuando la envoltura se pone una nueva versión del agente, puede haber nuevas dependencias JAR, es decir, cambios de ruta de clase, lo que significa que probablemente quiera engendrar un proceso de Java separado en lugar de jugar con ClassLoaders y correr el riesgo de una fuga de memoria de generación permanente, lo que requeriría una intervención manual, exactamente de lo que estoy intentando alejarme. Esta es la razón por la que terminé con un proceso de "envoltura" por separado para administrar las actualizaciones del agente en mi prototipo.
  2. Algunos servidores donde se implementan los agentes tienen recursos limitados, por lo que cualquier solución debe tener bajo uso de CPU y memoria. Eso me hace querer una solución que no implique girar una nueva JVM y es un golpe contra tener un proceso de envoltura separado.
  3. El agente ya está implementado en los servidores Windows y RHEL, por lo que la solución debe ser multiplataforma, aunque no tendría problemas para duplicar una cantidad razonable del proceso en scripts por lotes y bash para que las cosas funcionen.

Pregunta: Como se ha dicho, quiero saber cómo hacer que una aplicación Java de actualización automática. Más específicamente, ¿hay marcos/bibliotecas por ahí que me ayuden con esto? ¿Alguien con experiencia en esta área me puede dar algunos consejos?

+2

http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –

+0

ejemplos Ver Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –

+0

Su solución no le permite actualizar el contenedor en sí, ¿no? – Miquel

Respuesta

0

Parece que Webstart es la única forma de hacerlo en este momento.

+0

Ver mi comentario en la otra respuesta "Web Start". –

+0

abajo atención de votantes para comentar? –

+0

No fui yo, pero espero que sea porque Webstart no es una solución a la pregunta. –

2

Eche un vistazo a Java Web Start.

Es la tecnología que ha sido parte de Java desde ... 1.5? tal vez 1.4? y permite la implementación e instalación de aplicaciones independientes basadas en Java a través de una red de búsqueda web. También le permite ejecutar siempre la última aplicación.

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

ver también esta pregunta: What's the best way to add a self-update feature to a Java Swing application?

+1

Lo siento. Quise dejar en claro que estos son servidores sin cabeza, y la aplicación se ejecuta como un daemon de fondo. Estas no son estaciones de trabajo. No tienen un entorno de escritorio, mucho menos un navegador compatible con Web Start.Visité Web Start pero llegué a la conclusión de que estaba orientado a entregar una aplicación a un usuario. Esto debe ser completamente automatizado y desatendido. Actualizaré mi pregunta para dejar eso en claro. –

+0

Webstart puede invocarse desde la línea de comandos (no requiere un navegador) utilizando el comando javaws: http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html –

+1

I ' No estoy seguro, pero creo que no hay manera de evitar la ventana emergente de seguridad cuando se usan javaws, incluso desde la línea de comandos. Para las personas que desean implementar aplicaciones Java sin pagar un certificado de seguridad confiable o actualizar de forma silenciosa las aplicaciones Java existentes, Java Web Start se está volviendo desfavorable. – Andy

4

Si su aplicación se basa OSGi, se puede dejar que OSGi tratar las actualizaciones de paquete para usted. Es similar al enfoque de envoltura que sugiere, ya que el contenedor OSGi en sí mismo es "el contenedor" y parte de él no se actualizará. Aquí hay una discusión en this

+0

Buena idea. Consideré OSGi, pero está la restricción de recursos para considerar. Los contenedores OSGi que probé tienen huellas de memoria significativas sin siquiera tener paquetes implementados. Sin embargo, me gustaría que me corrigieran en ese punto. –

+1

Otro recurso a considerar es tu tiempo. OSGi es extremadamente invasivo en la arquitectura de su aplicación, y las reglas de carga de clases que impone pueden tardar un tiempo en aprender. Está bien una vez que esté funcionando (¡y que alguien implemente la actualización es excelente!) Pero no creo que sea un día de trabajo. –

4

Solución diferente: use (y pague) install4j. Consulte las características de actualización automática here

+0

Esa es la mejor ventaja que he visto hasta ahora, que recogí de [otra pregunta] (http://stackoverflow.com/questions/207557/whats-the-best-way-to-add-a-self-update -feature-to-a-java-swing-application), aunque no he profundizado lo suficiente para ver si realmente satisface mis necesidades. –

2

Sin necesidad de envoltorio (guardar memoria) o java web start (agrega más restricciones a su aplicación), simplemente permita que un hilo de su aplicación revise periódicamente las actualizaciones (por ejemplo, de la nube) y descargar actualizaciones si está disponible, a continuación, codificar estas dos llamadas en que la aplicación:

  1. lanzamiento de un script de shell (.sh o .cmd) para actualizar sus artefactos y carga la aplicación después de unos segundos de pausa en la secuencia de comandos (para evitar tener dos instancias de su aplicación al mismo tiempo).
  2. finalizar su aplicación (primera instancia)

La escritura se puede sobrescribir los artefactos necesarios y se vuelve a poner en marcha su aplicación.

¡diviértase!

Cuestiones relacionadas