run juegos java jar

java - juegos - Actualice un archivo dentro de un JAR en un directorio específico con el comando jar



manifest jar java (6)

Así que he estado buscando respuestas altas y bajas para esto y obviamente no he encontrado una respuesta satisfactoria.

El problema es que quiero actualizar un JAR (o cualquier otro archivo) dentro de un JAR, pero dicho archivo está dentro de una estructura de carpetas, lo que me gustaría evitar reproducir fuera del JAR para poder actualizarlo.

Ejemplo:

Foo.jar (root directory) / |->/folder1 | |->/folder2 | |->/foo | |-->/bar | |---->/baz | |------>file_to_update.jar

Entonces, si quiero actualizar esto usando el comando jar , primero tendría que crear la misma estructura de carpetas fuera del JAR y luego hacer

jar -uf Foo.jar -C foo/bar/baz/file_to_update.jar

Sin embargo, me gustaría evitar crear esta estructura de carpetas ya que para ciertos archivos puede ser bastante profunda y también porque podría necesitar actualizar los archivos seleccionados en todo el contenedor JAR, por lo que no me gustaría crear tantas carpetas con una estructura específica. por lo que el comando jar puede actualizarlos.

Para decirlo de otra manera, me gustaría decirle al comando jar que actualice un archivo de destino específico dentro de un directorio de destino específico, utilizando un archivo de origen específico dentro de un directorio de origen específico.

Es decir, algo como

jar -uf Foo.jar -sourceFile /x/y/z/filetoupdate -destFile /a/b/c/filetoupdate

(Sé que esta sintaxis no funciona, es solo para ejemplificar lo que necesito).

Se puede hacer esto? Me parecería muy extraño que tuviera que imitar absolutamente toda la estructura de carpetas cuando el comando jar pudiera encontrar una coincidencia o algo así, ya que podría tener la necesidad de actualizar un archivo dentro de una estructura de carpetas que tenga 100 carpetas de profundidad. . Sería demasiado complejo reproducirlo solo para actualizar el archivo.

Además, sé que se podría usar una utilidad ZIP normal, pero la que tengo disponible en Linux no es actualizar el archivo, incluso si dice que lo hizo (al volver a abrir el jar, tiene la versión antigua intacta), y ahora mismo No puedo ir a buscar otra (política de la empresa, sin tiempo, problemas de prueba, nombre).

Finalmente, si puedo hacer esto desde una línea de comandos, significa que puedo crear un archivo por lotes para actualizar muchos archivos específicos sin tener que crear la estructura de carpetas.

Olvidé decir que también me gustaría evitar tener que abrir, actualizar y volver a crear todo, ya que este JAR puede aumentar hasta 2 GB, por lo que me lleva un tiempo hacer esto solo, básicamente, agregar un pequeño archivo de recursos a mi JAR gigantesco.

Cualquier ayuda en esto es muy apreciada!


Como ya se indicó en la respuesta aceptada, no puede utilizar ni el comando zip ni el comando jar para insertar un archivo específico en el sistema de archivos en un directorio específico dentro del archivo comprimido.

Pero hay una solución alternativa que, en pocas palabras, extrae primero un archivo específico dentro del archivo comprimido, puede actualizarlo y luego volver a colocarlo en el archivo comprimido:

1. Extraer un solo archivo:
Considera un tarro con los siguientes contenidos.

$ jar tvf foo.jar 0 Thu Jan 10 00:05:06 IST 2013 META-INF/ 68 Thu Jan 10 00:05:06 IST 2013 META-INF/MANIFEST.MF 0 Thu Jan 10 00:04:30 IST 2013 x/ 0 Thu Jan 10 00:07:36 IST 2013 x/b/ 9 Thu Jan 10 00:07:36 IST 2013 x/b/hello.txt 0 Thu Jan 10 00:04:30 IST 2013 x/a/

Para extraer solo hello.txt, debe proporcionar la ruta completa del archivo a extraer. Jar crea carpetas apropiadas también.

Ejemplo:

$ jar xvf foo.jar x/b/hello.txt inflated: x/b/hello.txt $ tree x/ x └── b └── hello.txt 1 directory, 1 file

2. Actualizando un solo archivo

  1. Modificar el archivo extraído
  2. actualiza el frasco usando la bandera ''u''. Proporcione la raíz del directorio explotado y el jar actualizará todos los elementos de ruta debajo de él.

Ejemplo:

$ jar vfu foo.jar x/ adding: x/(in = 0) (out= 0)(stored 0%) adding: x/b/(in = 0) (out= 0)(stored 0%) adding: x/b/hello.txt(in = 23) (out= 11)(deflated 52%)

3. ¿Con qué versión de jar probé esto?

Utilicé jar con JDK 7 en Fedora 17.

He verificado todos los pasos mencionados aquí. Espero que esto ayude.


Creo que esto se debe a cómo funcionan las clases en el paquete java.util.zip. Se sientan encima de los arroyos.

La clase ZipFile está construida sobre un ZipFileInputStream. La escritura de archivos zip se realiza alimentando las ZipEntries una por una a ZipOutputStream.

Asumo que el ejecutable jar está construido sobre estas clases.


Funciona, pero no es la solución exacta que estás buscando.

En lugar de crear manualmente la estructura de carpetas, le pido que mencione la ruta completa, por lo que mkdir también creará carpetas y subdirectorios. Espero que esto ayude ...

set /p Folder=where you want to move inside jar set /p File=Mention path of file to be moved set /p Jarfile=Where is your jar file mkdir %Folder% copy %File% %Folder% jar -uvf %Jarfile% %File% rd /s /q %Folder% rmdir %Folder%


Yo también intentaba actualizar un archivo jar sin reproducir la estructura de archivos externa del archivo jar y, por alguna razón, el comando jar uf jarFileName -C ... nunca me permite copiar el archivo en un directorio secundario del archivo jar. Luego intenté cortar y pegar el archivo en el contenedor utilizando el administrador de archivos incorporado de ubuntu 14.04 (es decir, hacer clic derecho en el archivo jar y elegir "abrir con el administrador de archivos" y luego pegar el archivo en cualquier lugar de la estructura de archivos del archivo), y funcionó . No es una solución cli pero funciona. Espero que esto le salve a alguien más tiempo.


Esta discusión anterior muestra algunos códigos fuente Java para actualizar un archivo zip (o jar).

No me queda del todo claro si esto será realmente más rápido que usar jar -u , pero al menos debería poder adaptar ese código para que no tenga que recrear la estructura de archivos en el disco.

Edición: Aquí está la documentación sobre la utilidad ''jar'': usted puede ver por sí mismo que el comportamiento particular que está buscando, aunque sería útil, no está ahí.

Creo que la razón es que la interfaz de línea de comandos es básicamente un clon del comando ''tar'' de Unix / Linux. Por supuesto, produce formato zip, en lugar de tar.

Edición n. ° 2: se me ocurrió que para agregar un archivo a un zip, solo tendría que quitar el directorio central del final del archivo, agregar la nueva entrada y luego volver a escribir el directorio central. Una actualización sería lo mismo, excepto que en lugar de agregar la entrada al directorio, actualizaría la entrada del directorio existente para que apunte a la nueva entrada zip.

Mientras exploraba esta posibilidad, descubrí que Java 7 incluye un proveedor de sistemas de archivos zip que parece que lo hace, y podría constituir la base de una solución para lo que quiere hacer.


4129445: una API para actualizar de forma incremental los archivos ZIP en la base de datos de errores de Sun / Oracle solicita que esta característica se implemente en la api de java.

De la evaluación:

"Es fácil simpatizar con aquellos que quieren que se corrija este error. Tal vez sea más fácil simpatizar con aquellos que, sin darse cuenta, han sobrescrito archivos JAR que ya están en uso por una JVM en ejecución".

y

"Hubiera sido bueno si las API de jar & zip hubieran permitido archivos zip mutables desde el primer día. Pero en este punto es probable que se agregue la mutabilidad a los archivos jar y zip de Java (o más bien, aumentar la facilidad de mutación de ellos) Más problemas difíciles de depurar ".