Pourquoi mon URI n’est-elle pas hiérarchique?

J’ai des fichiers dans le dossier de ressources. Par exemple, si je dois extraire un fichier du dossier de ressources, je fais comme ça:

File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI()); System.out.println(MyClass.class.getResource(/myFile.jpg).getPath()); 

J’ai testé et tout fonctionne !

Le chemin est

/D:/java/projects/…/classes/X/Y/Z/myFile.jpg

Mais si je crée un fichier jar en utilisant Maven :

 mvn package 

… puis lancez mon application:

 java -jar MyJar.jar 

J’ai l’erreur suivante:

 Exception in thread "Thread-4" java.lang.RuntimeException: ხელმოწერის განხორციელება შეუძლებელია Caused by: java.lang.IllegalArgumentException: URI is not hierarchical at java.io.File.(File.java:363) 

et le chemin du fichier est :

 file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg 

Cette exception se produit lorsque j’essaie d’obtenir le fichier du dossier de ressources. À cette ligne Pourquoi? Pourquoi ce problème dans le fichier JAR? Qu’est-ce que tu penses?

Existe-t-il un autre moyen d’obtenir le chemin du dossier de ressources?

Vous devriez utiliser

 getResourceAsStream(...); 

lorsque la ressource est regroupée sous forme de fichier jar / war ou de tout autre fichier unique en son genre.

Voir la chose est, un pot est un fichier unique (un peu comme un fichier zip) contenant beaucoup de fichiers ensemble. À partir de pov d’Os, c’est un fichier unique et si vous voulez accéder à une part of the file (votre fichier image), vous devez l’utiliser comme un stream.

Documentation

Voici une solution pour les développeurs 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(); } 

Il est très important d’utiliser FileLocator.toFileURL(fileURL) plutôt que resolve(fileURL) , car lorsque le plug-in est compressé dans un fichier jar, Eclipse créera une version décompressée dans un emplacement temporaire pour accéder à l’object avec File. Par exemple, je suppose que Lars Vogel a une erreur dans son article – http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

Je suis confronté au même problème lorsque je travaillais sur un projet dans mon entreprise. Tout d’abord, l’URI n’est pas hiérarchique Le problème est dû au fait que vous utilisez probablement ” / ” comme séparateur de fichiers.

Vous devez vous rappeler que “/” est pour Windows et du système d’exploitation au système d’exploitation, il change, il peut être différent sous Linux. Par conséquent, utilisez File.seperator .

Donc en utilisant

 this.getClass().getClassLoader().getResource("res"+File.separator+"secondFolder") 

peut supprimer l’URI pas hierarichal. Mais maintenant, vous pouvez faire face à une exception de pointeur nul. J’ai essayé de nombreuses manières différentes, puis j’ai utilisé la classe JarEnsortinges pour le résoudre.

 File jarFile = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); Ssortingng 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 ensortinges = jar.ensortinges(); //gives ALL ensortinges in jar System.out.println("Reading ensortinges in jar file "); while(ensortinges.hasMoreElements()) { JarEntry jarEntry = ensortinges.nextElement(); final Ssortingng 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(); 

Vous devez spécifier le nom du jar ici explicitement. Donc, utilisez ce code, cela vous donnera un répertoire et un sous-répertoire dans le dossier dans jar.