Reputation: 6919
here is the structure of my project.
proj
---src
----main
----java
----Main.java
----resources
----res.txt
I am using m2eclipse plugin with Eclipse. In Main.java, I have
File f = new File("res.txt"); System.out.println(f.getAbsolutePath());
When I run mvn exec:java, the path got printed out is "...\proj\res.txt". How can I make it look for the resource file in "...\proj\target\classes" directory?
EDIT:
Thanks for the answers to my original question. I have a follow-up questions:
So basically what I want to do is to have the Main class read the "res.txt" and then generate a new "newres.txt" to the resources directory so that I can package this new "newres.txt" to the jar file in the package phase later. Currently I mounted this exec:java to the prepare-package phase. How should I create this "newres.txt" in the resources directory without a hard-coded absolute path or depending on the directory structure of Maven?
Upvotes: 19
Views: 31361
Reputation: 2776
Here is anther solution:
String str = "target/classes/res.txt";
InputStream is = new FileInputStream(new File(str));
If you exec java
in root folder, and you resource will compile to target/classes
folder, you can write you code like this.
Upvotes: 1
Reputation: 17904
Figure I'd add to the answers.
You can also use:
InputStream file = ClassLoader.getSystemResourceAsStream("res.txt");
Upvotes: 16
Reputation: 59634
Try
InputStream IS = Main.class.getResourceAsStream("res.txt");
to access the content of res.txt
. Pay attention to the encoding of your text file (beware of defaults). If your maven project is set on UTF-8 for example, make sure res.txt
is encoded in UTF-8 too, otherwise, you'll get funny errors at runtime.
Upvotes: 12
Reputation: 6919
I guess I will answer my own question, Thread.currentThread().getContextClassLoader().getResourceAsStream()
works the best for me, especially when the project produces a jar dependency for another web project.
Upvotes: 20
Reputation: 52665
When run from eclipse, res.txt
is created in/reader from the folder where eclipse is started. Hence the output.
If you want to make the code look at the file in a specific folder, which is present in your classpath, then you should try using getResourceAsStream() method.
Alternately you can specify the absolute path of the file.
Upvotes: 1