wake-up-neo.com

Kann nicht auf Dateien im Ressourcenverzeichnis mit Maven zugreifen (mit Eclipse IDE)

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:

  • Ausführen als> Maven Build> Prozessressourcen
  • Ausführen als> Maven Build> Prozess-Testressourcen
  • Ausführen als> Maven Build> Kompilieren

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.

21
Iraes

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.

39
Sam Hanes

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

4
Marco

Ü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>
3
Vandit Upadhyay

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;
}
0