Не удается получить доступ к файлам в каталоге ресурсов с помощью 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;
}