Ich habe seit ein paar Stunden ein Problem und habe alle Lösungen ausprobiert, die ich in den Tutorials gefunden habe ... Es ist einfach: Ich kann nicht auf die Ressourcendateien zugreifen. Ich versuche, eine Datei zu öffnen, die ich in src/main/resources
und src/test/resources
eingefügt habe.
Ich habe ein einfaches Java-Projekt und verwende Maven mit Eclipse als IDE, mit dem m2e-Plugin . Ich möchte Ressourcenfilterung mit Maven mit verschiedenen Profilen verwenden, und es gibt meinen 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>
Und ich habe einen einfachen Test gemacht, in src/Java/test:
@Test
public void testOpenResourceFile() {
File testf=new File("/test.txt");
assertTrue(testf.exists());
}
In Eclipse führe ich also (in meinem Projektordner in der Paketansicht) aus:
Mit env: LOCAL
Im Test mache ich: Run als> Junit Test Case . Aber es scheitert ... Ich habe im von Maven generierten Verzeichnis target/test-classes nachgesehen, und die Datei test.txt ist da.
Habe ich beim Übersetzen meines Projekts einige Schritte verpasst oder liegt ein Problem mit meiner Konfiguration vor?
BEARBEITEN:
Ich habe es auch mit File("test.txt")
und File("../test.txt")
versucht.
Es sieht für mich wie dein Problem aus
File testf = new File( "/test.txt" );
Das sucht nach einer Datei namens test.txt
im Stammverzeichnis des Dateisystems Ihres Computers. Was Sie wollen, ist die Wurzel des Ressourcenbaums, die Sie mit der getResource
-Methode erhalten:
File testf = new File( this.getClass().getResource( "/test.txt" ).toURI() );
Oder verwenden Sie im statischen Kontext den Namen der enthaltenden Klasse:
File testf = new File( MyClass.class.getResource( "/test.txt" ).toURI() );
Natürlich müssen Sie diesem Beispiel die Fehlerbehandlung hinzufügen.
Ich hatte das gleiche Problem. Stellen Sie nur sicher, dass sich die Datei "text.txt" im Ressourcenordner des Testprojekts (src/test/resources/text.txt) und nicht in einem anderen Ressourcenordner befindet. Sie sollten die Datei wie folgt aus dem Ressourcenordner abrufen:
this.getClass().getClassLoader().getResource("text.txt").getFile();
Wenn dies immer noch nicht funktioniert, versuchen Sie, die useSystemClassLoader
von maven-surefire-plugin
in Ihrem pom.xml
auf false zu setzen.
http://maven.Apache.org/surefire/maven-surefire-plugin/examples/class-loading.html
Überprüfen Sie Ihr <build>
-Tag in pom.xml. Es sollte in etwa so aussehen. Das gleiche Problem wurde durch das Hinzufügen dieses <resources>
-Tags in den <build>
-Tag für mich hervorgerufen.
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
Ich habe diese Methode für diesen Job gemacht:
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;
}