2009-08-03 36 views
57

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

El archivo que quiero modificar son archivos de configuración, principalmente basados ​​en xml.

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

+0

¿Por qué quieres hacer eso? –

+0

Me gustaría mantener los archivos suplementarios dentro de la aplicación sin crear archivos temporales en el sistema de archivos. –

+0

Pruebe esta solución http://stackoverflow.com/a/4837522/1853864 Utilicé y mis problemas fueron resueltos. –

Respuesta

61

Usted puede utilizar la opción de ujar

De los tutoriales de Java:

jar uf jar-file input-file(s) 

"Todos los archivos que ya están en el archivo con el mismo nombre de ruta como un archivo que se añade será sobrescrito."

Ver Updating a JAR File.

Mucho mejor que volver a hacer todo el frasco. Invocar esto desde dentro de tu programa también parece posible. Pruebe Running Command Line in Java

+0

¡Impresionante! Pero agregaron los caminos divertidos. IE Bitbucket.foo.bar en lugar de com.etc.etc, el existente tiene – StarWind0

0

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

+0

y cómo, sin extraer y volver a discordancia? –

9

Los archivos Java jar 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 un pie en la puerta. El segundo problema es que, si desea recompilar una clase o algo, probablemente solo tendrá que volver a compilar el contenedor; pero un archivo de texto o algo así (xml, por ejemplo) debería modificarse con la suficiente facilidad.

1

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

EDITAR

Tenga en cuenta que esto es usar los internos a Java Editor de archivos JAR, que son secuencias de archivo. Estoy seguro de que hay una manera de hacerlo, puedes leer todo el contenedor en la memoria, modificar todo y luego volver a escribir en una secuencia de archivos. Eso es lo que creo que las utilidades como 7-Zip y otros están haciendo, ya que creo que el ToC de un encabezado zip debe definirse en el momento de la escritura. Sin embargo, podría estar equivocado.

2

Esto puede ser más trabajo que usted está buscando para hacer frente a corto plazo, pero sospecho que en el largo plazo, sería muy beneficioso para usted para ver en el uso Ant (o Maven, o incluso Bazel) en lugar de construir jar de forma manual. De esta forma, puede hacer clic en el archivo ant (si usa Eclipse) y reconstruir el contenedor.

Como alternativa, puede que realmente no desee tener estos archivos de configuración en el contenedor: si espera reemplazar estos archivos regularmente, o si se debe distribuir a varias partes, el archivo de configuración debería no ser parte del frasco en absoluto.

+2

De acuerdo. Sin embargo, es posible que desee colocar un archivo de configuración "predeterminado" en el JAR, de modo que si algo le sucede al externo (dañado, eliminado, etc.), puede volver a una configuración predeterminada. –

+0

Es cierto, aunque no sé cuántas aplicaciones continuarán funcionando sin sus archivos de configuración ... – dimo414

7

Como muchos han dicho, no puede cambiar un archivo en un JAR sin volver a explorar el JAR. Es incluso peor con Launch4J, tienes que reconstruir el EXE una vez que cambias el JAR. Entonces no sigas esta ruta.

En general, es una mala idea colocar los archivos de configuración en el JAR. Aquí está mi sugerencia. Busque su archivo de configuración en algunas ubicaciones predeterminadas (como el directorio principal, \ Archivos de programa \ etc). Si encuentra un archivo de configuración, úselo. De lo contrario, utilice el que está en el JAR como alternativa. Si hace esto, solo necesita escribir el archivo de configuración en la ubicación predeterminada y el programa lo recogerá.

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

1

Sí se puede, usando SQLite se puede leer o escribir en una base de datos desde el archivo JAR, de modo que usted no tendrá que extraer y luego volver frasco, sigue mi post http://shoaibinamdar.in/blog/?p=313

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

+1

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

1

Consulte TrueZip.

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

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í es tutorial de vídeo si es necesario: https://www.youtube.com/watch?v=ByLUeem7680

+0

, el software "Usar CAVAJ" es la respuesta aquí. El enlace es solo una adición si se necesita una explicación adicional. – Tomasz

7

Puede usar Vim:

vim my.jar

Vim es capaz de editar archivos de texto comprimido, dado que tiene unzip en su entorno.

+2

Esto es genial. Navega hasta el archivo que estás buscando y presiona Enter. Edite el archivo, luego escriba: wq para guardar! –

+0

Me da archivo sin formato –

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 elegir la opción "Abrir con WinRAR" en el menú contextual.
  2. Navega hasta el archivo que se va a editar y haz 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: seleccione "Sí" y se actualizará el JAR.
Cuestiones relacionadas