java - shade - ¿Por qué mi URI no es jerárquico?
maven-assembly-plugin (3)
Esta pregunta ya tiene una respuesta aquí:
Tengo archivos en la carpeta de recursos. Por ejemplo, si necesito obtener el archivo de la carpeta de recursos, me gusta eso:
File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI());
System.out.println(MyClass.class.getResource(/myFile.jpg).getPath());
¡He probado y todo funciona !
El camino es
/D:/java/projects/.../classes/X/Y/Z/myFile.jpg
Pero , si creo un archivo jar, usando, Maven :
mvn package
... y luego iniciar mi aplicación:
java -jar MyJar.jar
Tengo ese siguiente error:
Exception in thread "Thread-4" java.lang.RuntimeException: ხელმოწერის განხორციელება შეუძლებელია
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:363)
... y la ruta del archivo es :
file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg
Esta excepción ocurre cuando intento obtener un archivo de la carpeta de recursos. En esta linea ¿Por qué? ¿Por qué tiene ese problema en el archivo JAR? ¿Qué piensas?
¿Hay alguna otra forma de obtener la ruta de la carpeta de recursos?
Aquí hay una solución para desarrolladores 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 utilizar FileLocator.toFileURL(fileURL)
lugar de resolve(fileURL)
, porque cuando el complemento se empaqueta en un resolve(fileURL)
, esto hará que Eclipse cree una versión desempaquetada en una ubicación temporal para que se pueda acceder al objeto usando File. Por ejemplo, supongo que Lars Vogel tiene un error en su artículo: http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/
Deberías estar usando
getResourceAsStream(...);
cuando el recurso se incluye como un jar / war o cualquier otro paquete de archivo único para ese asunto.
Vea lo que pasa es que un archivo jar es un archivo único (algo así como un archivo zip) que contiene muchos archivos juntos. Desde el punto de vista de Os, es un archivo único y si desea acceder a una part of the file
(su archivo de imagen) debe usarlo como una secuencia.
Me enfrento al mismo problema cuando estaba trabajando en un proyecto en mi compañía. Primero que todo, el URI no es jerárquico. El problema es porque probablemente está usando " / " como separador de archivos.
Debe recordar que "/" es para Windows y de OS a OS cambia, puede ser diferente en Linux. Por lo tanto, use File.seperator .
Entonces usando
this.getClass().getClassLoader().getResource("res"+File.seperator+"secondFolder")
puede eliminar el URI no hierarichal. Pero ahora puede enfrentar una excepción de puntero nulo. Intenté muchas formas diferentes y luego utilicé JarEntries Class para resolverlo.
File jarFile = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
String actualFile = jarFile.getParentFile().getAbsolutePath()+File.separator+"Name_Of_Jar_File.jar";
System.out.println("jarFile is : "+jarFile.getAbsolutePath());
System.out.println("actulaFilePath is : "+actualFile);
final JarFile jar = new JarFile(actualFile);
final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
System.out.println("Reading entries in jar file ");
while(entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
final String name = jarEntry.getName();
if (name.startsWith("Might Specify a folder name you are searching for")) { //filter according to the path
System.out.println("file name is "+name);
System.out.println("is directory : "+jarEntry.isDirectory());
File scriptsFile = new File(name);
System.out.println("file names are : "+scriptsFile.getAbsolutePath());
}
}
jar.close();
Debe especificar el nombre del jar aquí explícitamente. Entonces use este código, esto le dará directorio y subdirectorio dentro de la carpeta en jar.