Reputation: 233
I have a problem for a couple of hours, and I tried all the solutions I've found on tutorials.
It's simple: I can't access the resource files. I try to open a file I've put in src/main/resources
and src/test/resources
.
I have a simple Java project and I use Maven, with Eclipse as IDE, with the m2e plugin.
I want to use resources filtering with Maven, with different profiles, and there's my POM.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<filters>
<filter>src/main/filters/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>LOCAL</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>local</env>
</properties>
</profile>
</profiles>
And I made a simple test, in src/java/test :
@Test
public void testOpenResourceFile() {
File testf=new File("/test.txt");
assertTrue(testf.exists());
}
So, in Eclipse, I run (on my project folder, in the package view) :
With env: LOCAL
In the test, I do: Run as > Junit Test Case. But it fail... I looked in target/test-classes directory generated by Maven, and the file test.txt is there.
Did I missed some steps during my project's compilation, or is there a problem with my configuration?
EDIT:
I tried with File("test.txt")
and File("../test.txt")
as well.
Upvotes: 23
Views: 62276
Reputation: 2513
I had the same problem, just make sure that the "text.txt" file is in the resources folder of the test project (src/test/resources/text.txt) and not in any other resources folder. Also, you should retrieve the file from the resources folder like this:
this.getClass().getClassLoader().getResource("text.txt").getFile();
If this still does not work then try to set the useSystemClassLoader
from the maven-surefire-plugin
to false in your pom.xml
.
http://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html
Upvotes: 5
Reputation: 186
I made this method for this job:
public static String getPropaccess(String key){
String value="";
Properties configFile = new Properties();
try {
configFile.load(Propaccess.class.getClassLoader().getResourceAsStream("test/resources/config.properties"));
value = configFile.getProperty(key);
return value;
} catch (IOException e) {
e.printStackTrace();
}
return value;
}
Upvotes: 0
Reputation: 345
Check your <build>
tag in pom.xml it should be something like this, faced the same issue and adding this <resources>
tag in the <build>
worked for me.
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
Upvotes: 6
Reputation: 2839
It looks to me like your problem is
File testf = new File( "/test.txt" );
That's looking for a file called test.txt
at the root of your computer's filesystem. What you want is the root of the resource tree, which you get with the getResource
method:
File testf = new File( this.getClass().getResource( "/test.txt" ).toURI() );
Or, in static context, use the name of the containing class:
File testf = new File( MyClass.class.getResource( "/test.txt" ).toURI() );
Of course you'll need to add error handling to that example.
Upvotes: 43