2011-03-21 14 views
7

Necesito copiar una carpeta, empaquetada en un Jar en tiempo de ejecución. Quiero hacerlo llamando a una función en una clase que también está contenida en la misma carpeta.Cómo extraer una carpeta de JAR

He intentado usar getSystemResource:

URL sourceDirUrl = ClassLoader.getSystemResource("sourceDirName"); 
File sourceDir = new File(sourceDirUrl.toURI()); 

pero no funciona. Probablemente tenga que usar la función getResourceAsStream recursivamente. ¿Hay una forma más elegante/directa de hacer esto?

en caso de tener que hacerlo de forma recursiva: 1. no quiero especificar los archivos codificados de forma rígida, quiero hacerlo de forma dinámica 2. No quiero crear un archivo aparte. Quiero que este recurso sea en el mismo tarro como las clases de tratar con ella

Gracias

que terminé haciendo lo Koziołek sugiere a continuación. Aunque esperaba una solución más elegante, parece que es lo mejor posible.

+0

¿Estás dando 'sourceDirName' como ruta completa? – Nishant

+0

sí, por favor dé un ejemplo para el 'sourceDirName' que usó. – asgs

+0

@Nishant - no, una ruta relativa, la primera línea trabaja, la dirección URL es correcta, es imposible sin embargo para crear un objeto File basado en esta URL, ya que la carpeta se encuentra dentro del archivo –

Respuesta

2

Jar archivo ZIP es simple. Puede usar el paquete java.util.zip. * En los archivos decompress.

+0

De esta manera la ubicación de la jarra necesita estar codificado en la aplicación. – greydet

+1

no ... Puede usar getResource como método para obtener la ubicación de jar. –

+0

Me interesaría saber cómo hacerlo mediante un método tan simple como el método getResource del cargador de clases y teniendo en cuenta todos los casos posibles de empaquetado de tarros. – greydet

5

Utilizando el cargador de clases no se puede recuperar una carpeta, ya que no puede ser un recurso de la ruta de clases.

Varias soluciones son posibles:

  • Utilizando el método getResource cargador de clases, recuperar todos los recursos de su carpeta de uno a uno si se sabe de antemano los nombres de archivo que está buscando.
  • paquete de la carpeta completa en un archivo que se puede recuperar desde el cargador de clases utilizando el método anterior.
  • Descomprime tu jar directamente para recuperar la carpeta contenida. Requiere conocer la ubicación precisa del contenedor desde el sistema de archivos. Esto no siempre es posible dependiendo de la aplicación y no es portátil.

Preferiría ir por la segunda solución que es más portátil y flexible, pero requiere volver a empaquetar el archivo para todas las modificaciones del contenido de la carpeta.

+0

1. No deseo especificar los archivos codificados, quiero hacerlo de forma dinámica 2. No deseo crear un archivo separado.Quiero que este recurso esté en el mismo contenedor que las clases que lo tratan –

+0

Es por eso que preferiría la segunda solución propuesta;) – greydet

Cuestiones relacionadas