Modificar un archivo dentro de un frasco

87

Me gustaría modificar un archivo dentro de mi jar. ¿Es posible hacer esto sin extraer y volver a sacudir, desde dentro de mi aplicación?

El archivo que quiero modificar son archivos de configuración, en su mayoría basados ​​en xml.

La razón por la que estoy interesado en no desajustar es porque la aplicación está empaquetada con launch4j si la abro no puedo crear el archivo .exe nuevamente.

Hamza Yerlikaya
fuente
1
Me gustaría mantener los archivos complementarios dentro de la aplicación sin crear archivos temporales en el sistema de archivos.
Hamza Yerlikaya
Pruebe esta solución stackoverflow.com/a/4837522/1853864 que usé y mis problemas se resolvieron.
A. Magalhães
¿Podría no aceptar la respuesta aceptada actual? Tiene una puntuación negativa y no es en absoluto útil
Dici

Respuestas:

83

Puede utilizar la uopción parajar

De los tutoriales de Java:

jar uf jar-file input-file(s)

"Se sobrescribirán los archivos que ya estén en el archivo y que tengan la misma ruta de acceso que un archivo que se está agregando".

Consulte Actualización de un archivo JAR .

Mucho mejor que hacer todo el frasco de nuevo. Invocar esto desde dentro de su programa también parece posible. Intente ejecutar la línea de comandos en Java

clwhisk
fuente
¡Increíble! Pero agregaron los nombres de ruta divertidos. IE Bitbucket.foo.bar en lugar del com.etc.etc que tiene el existente
StarWind0
26

Puedes usar Vim:

vim my.jar

Vim es capaz de editar archivos de texto comprimidos, siempre que los tenga unzipen su entorno.

Jose alban
fuente
3
Esto es genial. Navegue hasta el archivo que está buscando y presione Entrar. Edite el archivo, luego escriba: wq para guardar!
Michael Butler
También necesitas zipen tu entorno, poder guardar los cambios. ¡Gracias por la respuesta!
troig
11

Los archivos jar de Java tienen el mismo formato que los archivos zip, por lo que si tiene una utilidad de archivo zip que le permita modificar un archivo, tiene el pie en la puerta. El segundo problema es que si desea recompilar una clase o algo, probablemente tendrá que reconstruir el jar; pero un archivo de texto o algo (xml, por ejemplo) debería modificarse con bastante facilidad.

JustJeff
fuente
8

Como muchos han dicho, no se puede cambiar un archivo en un JAR sin volver a escanear el JAR. Es aún peor con Launch4J, tienes que reconstruir el EXE una vez que cambias el JAR. Así que no sigas esta ruta.

Por lo general, es una mala idea poner archivos de configuración en el JAR. Aquí está mi sugerencia. Busque su archivo de configuración en algunas ubicaciones predeterminadas (como el directorio de inicio, \ Archivos de programa \, etc.). Si encuentra un archivo de configuración, utilícelo. De lo contrario, use el que está en el JAR como respaldo. Si hace esto, solo necesita escribir el archivo de configuración en la ubicación predeterminada y el programa lo recogerá.

Otro beneficio de este enfoque es que el archivo de configuración modificado no se sobrescribe si actualiza su software.

Codificador ZZ
fuente
2

Esto puede ser más trabajo de lo que está buscando a corto plazo, pero sospecho que a largo plazo sería muy beneficioso para usted considerar el uso de Ant (o Maven , o incluso Bazel ) en lugar de construir jar manualmente. . De esa manera, puede simplemente hacer clic en el archivo ant (si usa Eclipse) y reconstruir el jar.

Alternativamente, es posible que desee no tener estos archivos de configuración en el jar; si espera que necesite reemplazar estos archivos con regularidad, o si se supone que se distribuirá a varias partes, el archivo de configuración no debe ser parte de el tarro en absoluto.

dimo414
fuente
2
Convenido. Sin embargo, es posible que desee poner un archivo de configuración "predeterminado" en el JAR, por lo que si algo le sucede al externo (dañado, eliminado, etc.), puede volver a la configuración predeterminada.
Thomas Owens
Es cierto, aunque no sé cuántas aplicaciones seguirían funcionando sin sus archivos de configuración ...
dimo414
1

Para ampliar lo que dijo dfa, la razón es que el archivo jar está configurado como un archivo zip. Si desea modificar el archivo, debe leer todas las entradas, modificar la que desea cambiar y luego escribir las entradas nuevamente en el archivo jar. Tuve que hacer esto antes, y esa fue la única manera que pude encontrar para hacerlo.

EDITAR

Tenga en cuenta que esto utiliza los editores de archivos jar internos de Java, que son flujos de archivos. Estoy seguro de que hay una manera de hacerlo, puede leer todo el jar en la memoria, modificar todo y luego volver a escribir en un flujo de archivos. Eso es lo que creo que están haciendo las utilidades como 7-Zip y otras, ya que creo que la ToC de un encabezado zip debe definirse en el momento de la escritura. Sin embargo, podría estar equivocado.

aperkins
fuente
1

Sí, puede, usando SQLite puede leer o escribir en una base de datos desde el archivo jar, para que no tenga que extraerlo y luego volverlo a jar, siga mi publicación http://shoaibinamdar.in/blog/? p = 313

utilizando la sintaxis "jdbc: sqlite :: resource:" podría leer y escribir en una base de datos desde el archivo jar

shoaib
fuente
1
Hola, bienvenido a stackoverflow. Eliminé las abreviaturas de tu publicación. En general, la taquigrafía del estilo de los mensajes de texto no es apropiada aquí. Creo que esta respuesta sería una buena respuesta a la pregunta si incluyeses algunos detalles más de tu blog, dentro de la respuesta en sí, para que alguien que lea tu respuesta aprenda algo incluso si no lee el blog o se mueve. a otra URL en una fecha futura.
Flexo
1

Echa un vistazo a TrueZip .

Hace exactamente lo que desea (editar archivos en línea dentro de un archivo jar), a través de una API de sistema de archivos virtual. También admite archivos anidados (jar dentro de un jar).

Gigante verde
fuente
1

Extraiga el archivo jar por ej. con winrar y use CAVAJ:

Cavaj Java Decompiler es una utilidad gráfica gratuita que reconstruye el código fuente de Java a partir de archivos CLASS.

aquí hay un video tutorial si lo necesita: https://www.youtube.com/watch?v=ByLUeem7680

Tomasz Mularczyk
fuente
Bueno, el software "Use CAVAJ" es la respuesta aquí. El enlace es solo una adición si se necesita alguna explicación adicional.
Tomasz Mularczyk
0

Siempre que este archivo no sea .class, es decir, archivo de recursos o archivo de manifiesto, puede hacerlo.

Sorantis
fuente
y ¿cómo, sin extraer y volver a sacudir?
user85421
0

La forma más sencilla que he encontrado para hacer esto en Windows es con WinRAR :

  1. Haga clic derecho en el archivo y elija "Abrir con WinRAR" en el menú contextual.
  2. Navegue hasta el archivo que desee editar y haga doble clic en él para abrirlo en el editor predeterminado.
  3. Después de realizar los cambios, guarde y salga del editor.
  4. Aparecerá un diálogo que le preguntará si desea actualizar el archivo en el archivo; elija "Sí" y se actualizará el JAR.
Steve Cámaras
fuente
0

la mayoría de las respuestas anteriores dicen que no puede hacerlo para el archivo de clase.

Incluso si desea actualizar el archivo de clase, también puede hacerlo. Todo lo que necesita hacer es arrastrar y soltar el archivo de clase desde su espacio de trabajo en el jar.

En caso de que desee verificar sus cambios en el archivo de clase, puede hacerlo usando un descompilador como jd-gui.

Subham Sood
fuente