2010-03-17 23 views
8

Hola amigos de Stack Overflow. Tengo un problema simple que me temo que no tiene una solución simple y necesito asesoramiento sobre cómo proceder. Estoy desarrollando una aplicación Java empaquetada como JAR ejecutable, pero se requiere modificar algunos de sus contenidos del archivo JAR durante la ejecución. En esta etapa, me tocó un problema porque algunos sistemas operativos bloquean el archivo impidiéndole escrituras.Modificar Ejecutar el archivo jar

Es esencial que el usuario vea una versión actualizada del archivo jar para cuando la aplicación finalice, aunque puedo ser bastante flexible en cuanto a cómo lograr esto. Una solución limpia y eficiente es obviamente preferible, pero la portabilidad es el único requisito difícil.

Los siguientes son tres enfoques que puedo ver para resolver el problema, no dude en comentarlos o sugerir otros.

  1. Dile a Java para desbloquear el archivo JAR para la escritura (ésto no parece posible, pero sería la solución easyest)
  2. Copiar los archivos de clase ejecutable en un archivo tempory al iniciar la aplicación, utilice un cargador de clases para cargar estos archivos y descargan los del archivo JAR inicial. (No tenía mucha experiencia con los cargadores de clases pero con suerte la JVM sería lo suficientemente inteligente como para darse cuenta de que el JAR original no está en uso y así desbloquearlo)
  3. Ponga un segundo Archivo JAR ejecutable dentro de Primero, al inicio, extraiga el contenedor interno para e archivo temporal, invoque un nuevo proceso java utilizando el JAR interior copiado y páselo a la ubicación del JAR externo, primer proceso salidas, segundo proceso modifys el tarro exterior unincumbered. (Esto funciona, pero no estoy seguro que hay una manera independiente de la plataforma de una aplicación java que invoca otra)

Sé que esto es una pregunta extraña pero cualquier ayuda se agradece .

+3

¿Puede dar alguna indicación de por qué necesita modificar el archivo jar durante la ejecución? – Poindexter

+0

@pinkynobrain estás pensando en la forma de la vieja escuela, te sugiero que leas maven por ejemplo ebook gratis, verás que lo que estás sugiriendo no tiene sentido ... No estoy tratando de ofenderte solo tratando de ayudarte ... no todos hemos estado allí – ant

+0

¿Qué intentas lograr: una aplicación que se actualice automáticamente? –

Respuesta

2

Una opción:

tiene el programa escribir modificado copia del archivo JAR.

Incluya en el archivo JAR un segundo JAR con una utilidad que, cuando se ejecuta, elimina el archivo JAR original y cambia el nombre de la copia modificada para que coincida con la del original.

Cuando su programa se cierra (y se han realizado cambios) extraiga esta utilidad y ejecútela en su propia JVM (usando Runtime.getRuntime().exec()). La utilidad esperaría a que el bloqueo salga del JAR original sin modificar y luego haga su trabajo y salga.

Para el usuario, el archivo JAR parece actualizarse al salir (¡o lo suficientemente cerca!).

+0

Oye, gracias por su respuesta, definitivamente es otra solución, aunque sigue siendo el mismo problema que mi opción 3. Supongo que el uso de exec ("java") es bastante portable. Solo esperaba que existiera alguna forma verdaderamente independiente de plataforma para generar una aplicación Java de otra. – PinkyNoBrain

+0

Si bien Java es mucho más independiente de la plataforma que muchos otros lenguajes, es imperfecto en muchos aspectos, y no es tan importante. tener algo así como la forma de ejecutar un archivo jar se hace en un conmutador basado en la plataforma (si es necesario que sea diferente, creo que 'java ' funciona en Unix y Windows, no estoy seguro acerca de osx). – Chris

+0

¿Qué pasa? obteniendo toda la información que necesita para ejecutar 'Runtime.getRuntime() .exec()' en una plataforma 'independiente' antes de la llamada real. Creo que el método' System.getProperties() 'tiene información útil ación. –

1

Honestamente creo que su enfoque es incorrecto. Esto simplemente no es una buena opción para la forma predeterminada de implementar java. Sus archivos modificados simplemente tendrán que persistir en un archivo db o xml en alguna parte, ese es el ÚNICO enfoque sensato.

Todo es simplemente "luchar contra el viento": es posible que con algunos problemas lo pongan a trabajar, pero eventualmente morderá a usted o al cliente.

+0

Lamentamos que no te guste esta respuesta. Con el cambio de nombre, el bloqueo, etc., solo estaba expresando mi opinión de que intentabas forzar una solución que no se ajustaba bien al problema. – MJB

+1

Eso sería un comentario, no una respuesta –

Cuestiones relacionadas