I'm using Maven for desktop applycation. I read about Maven standart directory layout and I have this project structure for now:
App
|-- pom.xml
`-- src
|-- main
|-- java
| `-- java classes
|-- resources
| `-- images
| `-- app images
`--config
`--config.xml
I want to find a way to load my resources and config files. I read some articles and topics and found this (simplified example from my code):
//class for loading config
public class Preferences {
public Preferences() {
InputStream image = Preferences.class.getResourceAsStream("images/image.png");
InputStream config = Preferences.class.getResourceAsStream("config.xml");
}
}
But image and config variables contains null. I was trying different variants of loading (from root folder, with this.getClass() instead of Preferences.class, and others), but I always have null. I really don't understand this resource loading system and I didn't find any good documentation about it. It would be nice, if somebody gives a good explanation about this mechanism (or just give a link on docs). So, the main question is: How can I load my resources and config files?
You can use
getResourceAsStream()
method ofjava.lang.Class
as you have done, but you have to add/
before the path.This question is tricky.
1. Two methods with same name
First of all, exist two methods of same name and same signature in these two classes:
They have the same name:
getResource(String)
(andgetResourceAsStream(String)
is alike).2. They accept params of different format
Then, the param of them has different format:
java.lang.Class.getResouce<asStream>()
accepts path with and without the leading/
, resulting in different resources searching strategies. If a path has no/
, Java will search the resource in the package/folder where the.class
file resides. If it has/
, Java will begin the searching from classpath root.The method
java.lang.ClassLoader.getResource<asStream>()
accepts only path without/
, because it always search from classpath. In a classpath based path,/
is not a valid character. **: As this answer states: this.getClass().getClassLoader().getResource("...") and NullPointerException
How to add a folder to classpath? In Eclipse we resolve to the context menu of a project: "Build path" - "Configure build path..." and add some folder to build path.
3. When it comes to Maven
At last, if a project is a Maven project, by default
src/main/resources
is in the classpath, so we can useor,
, to load anything under
src/main/resources
.If we want to add another resources folder, as you have mentioned, it is done in
pom.xml
. And they are added into classpath as well, done by Maven. No extra config is needed.4. Example
For example, if your
config.ini
is undersrc/main/resources/settings
,myAvatar.gif
undersrc/main/images
, you can do:In
pom.xml
:In code:
We must use
/
above.Or, with ClassLoader:
Try to build the project before. If you just put the files in the resources folder then you need to build the project in order to copy the new resource files into target folder
I think I found the solution. As Juned Ahsan and mR_fr0g write, I need to use ClassLoader class, instead of this.getClass().getResource(). But, it works only for resource folder. But maven allows to add other folders as resource folders. I was just needed to add this section to pom.xml:
And working java code is:
How about using this appraoch:
or
As you currently have it there, that will look for the MyProperty.properties file at the top of your classpath. The could be in your src/main/resources directory or other src folder -- it would depend on how your application (jar/war) is built.
If you are building a jar then you should be able to unpack it and see your properties file at the top level of the jar. If you are building a war, maybe it should be in the WEB-INF/classes directory. Again, it depends on how it was built.