wei
wei

Reputation: 6919

Maven exec:java : how to open and read a file in the resources directory?

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

Answers (5)

Shuai Li
Shuai Li

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

Cuga
Cuga

Reputation: 17904

Figure I'd add to the answers.

You can also use:

InputStream file = ClassLoader.getSystemResourceAsStream("res.txt");

Upvotes: 16

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

wei
wei

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

Raghuram
Raghuram

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

Related Questions