How to reference a resource file correctly for JAR and Debugging?
Solution 1:
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;
}
Solution 2:
I had a similar problem. After a full day of trying every combination and debugging I tried getClass().getResourceAsStream("resources/filename.txt") and got it to work finally. Nothing else helped.
Solution 3:
The contents of Maven resource folders are copied to target/classes and from there to the root of the resulting Jar file. That is the expected behaviour.
What I don't understand is what the problem is in your scenario. Referencing a Resource through getClass().getResource("/filename.txt")
starts at the root of the classpath, whether that (or an element of it) is target/classes
or the JAR's root. The only possible error I see is that you are using the wrong ClassLoader
.
Make sure that the class that uses the resource is in the same artifact (JAR) as the resource and do ThatClass.class.getResource("/path/with/slash")
or ThatClass.class.getClassLoader().getResource("path/without/slash")
.
But apart from that: if it isn't working, you are probably doing something wrong somewhere in the build process. Can you verify that the resource is in the JAR?