Нулевые результаты при чтении ресурса
Это моя структура проекта:
Это мой код, пытающийся прочитать файл в папке ресурсов:
package passgen;
public class Application {
public static void main(String[] args) {
System.out.println(Application.class.getResourceAsStream("/configuration.properties"));
System.out.println(Application.class.getResource("/configuration.properties"));
System.out.println(Application.class.getClassLoader().getResourceAsStream("/configuration.properties"));
System.out.println(Application.class.getClassLoader().getResource("/configuration.properties"));
System.out.println(new Application().getClass().getResourceAsStream("/configuration.properties"));
System.out.println(new Application().getClass().getResource("/configuration.properties"));
System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("/configuration.properties"));
System.out.println(new Application().getClass().getClassLoader().getResource("/configuration.properties"));
System.out.println(Application.class.getResourceAsStream("configuration.properties"));
System.out.println(Application.class.getResource("configuration.properties"));
System.out.println(Application.class.getClassLoader().getResourceAsStream("configuration.properties"));
System.out.println(Application.class.getClassLoader().getResource("configuration.properties"));
System.out.println(new Application().getClass().getResourceAsStream("configuration.properties"));
System.out.println(new Application().getClass().getResource("configuration.properties"));
System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("configuration.properties"));
System.out.println(new Application().getClass().getClassLoader().getResource("configuration.properties"));
}
Результаты все нулевые:
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
Замена "configuration.properties" на "src/main/resources/configuration.properties" (как с косой чертой, так и без косой черты) не имеет никакого значения.
Другие ответы, как это, скажи, чтобы использовать .getClass().getClassLoader().getResource(fileName)
но это уже одна из строчек. Почему все они нулевые и как мне получить ресурс?
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>passgen</groupId>
<artifactId>passgen</artifactId>
<version>1</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
<finalName>passgen</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/dist</targetPath>
<includes>
<include>**/*<!-- all resources that go to folder, rest will go into the jar --></include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*<!-- all resources that go to folder, rest will go into the jar --></exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<outputDirectory>${project.build.directory}/dist</outputDirectory>
<archive>
<manifest>
<!-- <addClasspath>true</addClasspath> -->
<mainClass>
passgen.Application
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
2 ответа
Нашел ответ. По какой-то причине Eclipse поставил шаблон исключения "**
"в главной папке /java/resources. Если у кого-то есть такая же проблема: щелкните правой кнопкой мыши по проекту -> Путь сборки -> Настроить путь сборки -> вкладка Источник. Для всех записей отметьте голос" Исключено ", это должно быть "(Нет)". Если у вас есть шаблон exlcusion, который исключает ваши файлы из пути к классам (например, "**"), нажмите "Удалить", чтобы удалить его.
РЕДАКТИРОВАТЬ: по какой-то причине Eclipse добавляет шаблон исключения **
в папку src/main/resource при запуске Maven -> Обновить проект
РЕДАКТИРОВАТЬ 2: Я обнаружил, что шаблон исключения в Eclipse в папке src/main/resource является нормальным (см. Этот ответ). Исключение означает, что не Eclipse обрабатывает компиляцию папки src/main/resources, а Maven (плагин Maven Eclipse, если быть точным, M2Eclipse). Тот факт, что эти ресурсы не были найдены в пути к классам, произошел из-за исключения, присутствующего в файле pom.xml:
<resource>
<directory>src/main/resources</directory>
<excludes>
<!-- these resources will be excluded from the classpath; they will not go in to the target/classes folder and will not be packaged into the artifact -->
<exclude>**/*</exclude>
</excludes>
</resource>
который я удалил, чтобы получить вывод, указанный ниже.
Теперь вывод кода выше выглядит так:
java.io.BufferedInputStream@7852e922
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
java.io.BufferedInputStream@4e25154f
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
null
null
java.io.BufferedInputStream@70dea4e
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
java.io.BufferedInputStream@5c647e05
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
Если вы хотите исключить ресурс из jar, исключите его из раздела maven-jar-plugin. Если вы хотите создать в выводе ресурсы, которые вы исключили из jar, сконфигурируйте плагин maven-resources-plugin с целью copy-resources, указывающей папку назначения (по умолчанию ресурсы упаковываются в артефакт, если вы просто исключаете их из Артефакт у вас не будет ресурсов нигде).
Вы должны указать полный путь к загрузчику классов на случай, если вы захотите загрузить его из каталогов проекта.
System.out.println(Application.class.getResourceAsStream("/main/resources/configuration.properties"));
Надеюсь это поможет.