Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reference a resource file correctly for JAR and Debugging?

Tags:

java

eclipse

jar

I have a nasty problem referencing resources when using a Maven project and Jar files...

I have all my resources in a dedicated folder /src/main/resources which is part of the build path in Eclipse. Files are referenced using

getClass().getResource("/filename.txt") 

This works fine in Eclipse but fails in the Jar file - there the resources are located in a folder directly below the jar's root...

Does anyone know a 'best practice' to reference a file both in the JAR and (!) in Eclipse?

Edit: The problem is that while the resources actually are located in the JAR in a folder "resources" at the top level, the above method fails to find the file...

like image 770
Patrick Avatar asked May 31 '11 19:05

Patrick


People also ask

How do you reference a resource file in Java?

In Java, we can use getResourceAsStream or getResource to read a file or multiple files from a resources folder or root of the classpath. The getResourceAsStream method returns an InputStream . // the stream holding the file content InputStream is = getClass(). getClassLoader().

How do I add a resource file to a JAR file?

1) click project -> properties -> Build Path -> Source -> Add Folder and select resources folder. 2) create your JAR! EDIT: you can make sure your JAR contains folder by inspecting it using 7zip. After following your EDIT tip, I learned that even though your resource file, e.g. someFile.


1 Answers

Once you pack the JAR, your resource files are not files any more, but stream, so getResource will not work!

Use getResourceAsStream.

To get the "file" content, use https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html:

static public String getFile(String fileName) {         //Get file from resources folder         ClassLoader classLoader = (new A_CLASS()).getClass().getClassLoader();          InputStream stream = classLoader.getResourceAsStream(fileName);          try         {             if (stream == null)             {                 throw new Exception("Cannot find file " + fileName);             }              return IOUtils.toString(stream);         }         catch (Exception e) {             e.printStackTrace();              System.exit(1);         }          return null; } 
like image 112
Thomas Decaux Avatar answered Sep 20 '22 14:09

Thomas Decaux