GetResourceAsStream возвращает null в Java 10

У меня есть приложение, работающее с Java 1.8.0 162, и я сейчас обновляю его до Java 10. Одна из моих проблем заключается в том, что

appProperties.getClass().getResourceAsStream("/application.properties")

начал возвращать null в Java 10. Есть идеи, почему? appProperties определяется так:

appProperties = new Properties();

и это происходит в статическом методе, если это актуально.

Файл присутствует в src/main/resources/application.properties. Это происходит независимо от того, использую ли я IntelliJ или jar-файл, созданный Maven.

Я пробовал добавить:

<resources>
    <resource>
       <directory>src/main/resources</directory>
    </resource>
</resources>

на мой pom.xml, но это не повлияло.

Распечатайте путь к классу с помощью:

System.getProperty("java.class.path")

дает, как первая запись:

C:\Users\pupeno\Documents\Dashman\code\dashman\target\classes

который содержит application.properties.

это поможет? stackoverflow.com/questions/16570523/…

blurfus 07.04.2018 01:43

Имеет ли для вас какое-то значение javadoc для ClassLoader.getSystemResourceAsStream ()?

Klaimmore 07.04.2018 01:44

@ochi: Я не использую класс класса, поэтому должен, я должен использовать правильный загрузчик классов.

pupeno 07.04.2018 01:45

@Klaimmore: вроде как. Я вижу, что модульная система может быть задействована, поэтому я собираюсь прочитать об этом, но я не использую getSystemResourceAsAStream() или загрузчик системных классов.

pupeno 07.04.2018 01:47

Если открыть банку, где файл?

OneCricketeer 07.04.2018 01:47

Что дает System.out.println(appProperties.getClass().getResource("/")‌​)?

SeverityOne 07.04.2018 01:49

Невозможно воспроизвести это. У меня есть две разные настройки для JDK 8 и JDK 10, в обоих случаях я использую идею intelliJ ad maven. Я быстро проверил, воспроизвести не смог.

jmj 07.04.2018 01:50

@ cricket_007: в корне баночки.

pupeno 07.04.2018 01:51
java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
jmj 07.04.2018 01:51

@SeverityOne: также null.

pupeno 07.04.2018 01:52

в вашей IDEA вы можете распечатать записи пути к классам с помощью System.getProperty("java.class.path"), и для каждой записи выйдите на терминал и посмотрите, содержит ли он файл application.properties в корне этих записей.

jmj 07.04.2018 01:53

@JigarJoshi: Я добавил это к вопросу. Да, application.properties есть.

pupeno 07.04.2018 01:56

@popeno Вы запускали приложение из кода модуля? Если не пробовали?

Andrew Sasha 09.04.2018 10:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
13
3 019
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я нашел решение, хотя я не совсем понимаю, почему это работает, а проблемная строка - нет, но это работает:

Application.class.getResourceAsStream("/application.properties")

где Application - это просто класс в моем приложении.

Возможно, это связано с ответом, на который указывает очи, и Application.class использует загрузчик классов мой, а appProperties.getClass() использует загрузчик системных классов. Но почему он по-разному ведет себя по-разному на Java 8 против 10, не очевидно.

Да, похоже, это та же проблема ... все же странно, тем не менее

blurfus 07.04.2018 02:01

Просто вызовите getClass из любого нестатического метода.

Abhijit Sarkar 07.04.2018 02:22

@AbhijitSarkar: мне нужно значение в статическом методе.

pupeno 07.04.2018 09:51

Затем используйте имя класса.

Abhijit Sarkar 07.04.2018 10:15

@AbhijitSarkar: это то, что я уже сделал и задокументировал в своем ответе здесь.

pupeno 07.04.2018 10:16

Класс этой переменной является системным и загружается другим загрузчиком классов.

Вы должны использовать один из ваших классов собственный.

Верно. appProperties.getClass().getResourceAsStream(...) является эквивалентом Properties.class.getResourceAsStream(...), поэтому он находит ресурс, связанный с java / util / Properties. Переход на Application.class.getResourceAsStream(...), чтобы ресурс был связан с классом приложения, - это правильный шаг.

Alan Bateman 14.04.2018 09:50

Я получил ту же ошибку при использовании Intellij, и исправление состояло в том, что мне нужно было добавить формат файла конкретного ресурса, который я собираюсь получить. Перейдите CRTL + ALT + s или настройки-> компилятор-> шаблоны ресурсов: Введите расширение файла в это поле. Нажмите "Применить", затем хорошо

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