Why is my URI not hierarchical?

grep picture grep · Aug 5, 2013 · Viewed 90.8k times · Source

I have files in resource folder. For example if I need to get file from resource folder, I do like that:

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

I've tested and everything works!

The path is

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

But, If I create jar file, using , Maven:

mvn package

...and then start my app:

java -jar MyJar.jar

I have that following 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)

...and path of file is:

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

This exception happens when I try to get file from resource folder. At this line. Why? Why have that problem in JAR file? What do you think?

Is there another way, to get the resource folder path?

Answer

rocketboy picture rocketboy · Aug 5, 2013

You should be using

getResourceAsStream(...);

when the resource is bundled as a jar/war or any other single file package for that matter.

See the thing is, a jar is a single file (kind of like a zip file) holding lots of files together. From Os's pov, its a single file and if you want to access a part of the file(your image file) you must use it as a stream.

Documentation