Нулевые результаты при чтении ресурса

Это моя структура проекта:

Это мой код, пытающийся прочитать файл в папке ресурсов:

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"));

Надеюсь это поможет.

Другие вопросы по тегам