I would like to read a resource from within my jar like so:
File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferredReader reader = new BufferedReader(new FileReader(file));
//Read the file
and it works fine when running it in Eclipse, but if I export it to a jar the run it there is an IllegalArgumentException:
Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical
and I really don't know why but with some testing I found if I change
file = new File(getClass().getResource("/file.txt").toURI());
to
file = new File(getClass().getResource("/folder/file.txt").toURI());
then it works the opposite (it works in jar but not eclipse).
I'm using Eclipse and the folder with my file is in a class folder.
You can use class loader which will read from classpath as ROOT path (without "/" in the beginning)
If you wanna read as a file, I believe there still is a similar solution:
Up until now (December 2017), this is the only solution I found which works both inside and outside the IDE.
Use PathMatchingResourcePatternResolver
Note: it works also in spring-boot
In this example I'm reading some files located in src/main/resources/my_folder:
Rather than trying to address the resource as a File just ask the ClassLoader to return an InputStream for the resource instead via getResourceAsStream:
As long as the
file.txt
resource is available on the classpath then this approach will work the same way regardless of whether thefile.txt
resource is in aclasses/
directory or inside ajar
.The
URI is not hierarchical
occurs because the URI for a resource within a jar file is going to look something like this:file:/example.jar!/file.txt
. You cannot read the entries within ajar
(azip
file) like it was a plain old File.This is explained well by the answers to:
I think this should be works in java as well. The following code I use is using kotlin.