Saltar al contenido

Archivo Java Jar: use errores de recursos: el URI no es jerárquico

Esta es la solución más acertada que encomtrarás brindar, sin embargo estúdiala detenidamente y valora si es compatible a tu proyecto.

Solución:

No puedes hacer esto

File src = new File(resourceUrl.toURI()); //ERROR HERE

no es un archivo! Cuando ejecuta desde el ide, no tiene ningún error, porque no ejecuta un archivo jar. En el IDE, las clases y los recursos se extraen en el sistema de archivos.

Pero puedes abrir un InputStream De este modo:

InputStream in = Model.class.getClassLoader().getResourceAsStream("/data.sav");

Eliminar "/resource". En general, los IDE se separan en clases y recursos del sistema de archivos. Pero cuando se crea el frasco, se juntan todos. Así que el nivel de carpeta "/resource" se utiliza sólo para la separación de clases y recursos.

Cuando obtiene un recurso del cargador de clases, debe especificar la ruta que tiene el recurso dentro del contenedor, esa es la jerarquía real del paquete.

Si por alguna razón realmente necesita crear un java.io.File object para apuntar a un recurso dentro de un archivo Jar, la respuesta está aquí: https://stackoverflow.com/a/27149287/155167

File f = new File(getClass().getResource("/MyResource").toExternalForm());

Aquí hay una solución para los desarrolladores de Eclipse RCP / Plugin:

Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try 
   URL resolvedFileURL = FileLocator.toFileURL(fileURL);

   // We need to use the 3-arg constructor of URI in order to properly escape file system chars
   URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
   File file = new File(resolvedURI);
 catch (URISyntaxException e1) 
    e1.printStackTrace();
 catch (IOException e1) 
    e1.printStackTrace();

Es muy importante usar FileLocator.toFileURL(fileURL) en vez de resolve(fileURL)
, porque cuando el complemento se empaqueta en un contenedor, esto hará que Eclipse cree una versión desempaquetada en una ubicación temporal para que se pueda acceder al objeto mediante Archivo. Por ejemplo, supongo que Lars Vogel tiene un error en su artículo: http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

Reseñas y calificaciones

Si eres capaz, tienes la libertad de dejar una sección acerca de qué le añadirías a esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *