Не удается получить доступ к файлам в каталоге ресурсов с помощью Maven (с Eclipse IDE)

У меня проблема в течение нескольких часов, и я пробовал все решения, которые я нашел в учебниках. Это просто: я не могу получить доступ к файлам ресурсов. Я пытаюсь открыть файл, который я ввел в src/main/resources и src/test/resources.

У меня есть простой Java-проект, и я использую Maven, с Eclipse как IDE, с плагином m2e. Я хочу использовать фильтрацию ресурсов с Maven, с разными профилями, и там мой 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>

И я сделал простой тест в src/java/test:

@Test
public void testOpenResourceFile() {
    File testf=new File("/test.txt");
    assertTrue(testf.exists());
}

Итак, в Eclipse я запускаю (в моей папке проекта, в представлении пакета):

  • Выполнить как > Maven build > process-resources
  • Выполнить как > Maven build > process-test-ressources
  • Запустить как > Maven build > компилировать

С env: LOCAL

В тесте я делаю: Запускаю как > Тест-тест Junit. Но это терпит неудачу... Я просмотрел каталог target/test-classes, сгенерированный Maven, и файл test.txt существует.

Я пропустил некоторые шаги во время компиляции проекта или возникла проблема с моей конфигурацией?

Спасибо за помощь.

ИЗМЕНИТЬ

Я попробовал с File("test.txt") и File("../test.txt").

Ответы

Ответ 1

Мне кажется, что ваша проблема -

File testf = new File( "/test.txt" );

Поиск файла с именем test.txt в корне вашей файловой системы компьютера. То, что вы хотите, это корень дерева ресурсов, который вы получаете с помощью метода getResource:

File testf = new File( this.getClass().getResource( "/test.txt" ).toURI() );

Или в статическом контексте используйте имя содержащего класса:

File testf = new File( MyClass.class.getResource( "/test.txt" ).toURI() );

Конечно, вам нужно добавить обработку ошибок в этот пример.

Ответ 2

У меня была такая же проблема, просто убедитесь, что файл "text.txt" находится в папке ресурсов тестового проекта, а не в любой другой папке ресурсов (т.е. src/test/resources/text.txt). Кроме того, вы должны извлечь файл из папки ресурсов следующим образом:

this.getClass().getClassLoader().getResource("text.txt").getFile();

Если это все еще не работает, попробуйте установить useSystemClassLoader из maven-surefire-plugin в false в pom.xml.

http://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html

Ответ 3

Проверьте тэг <build> в pom.xml, он должен быть чем-то вроде этого, столкнулся с той же проблемой и добавил, что этот тег <resources> в <build> работал у меня.

<build>
    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

Ответ 4

Я сделал этот метод для этого задания:

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