У меня есть приложение, работающее с 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.
Имеет ли для вас какое-то значение javadoc для ClassLoader.getSystemResourceAsStream ()?
@ochi: Я не использую класс класса, поэтому должен, я должен использовать правильный загрузчик классов.
@Klaimmore: вроде как. Я вижу, что модульная система может быть задействована, поэтому я собираюсь прочитать об этом, но я не использую getSystemResourceAsAStream() или загрузчик системных классов.
Если открыть банку, где файл?
Что дает System.out.println(appProperties.getClass().getResource("/"))?
Невозможно воспроизвести это. У меня есть две разные настройки для JDK 8 и JDK 10, в обоих случаях я использую идею intelliJ ad maven. Я быстро проверил, воспроизвести не смог.
@ cricket_007: в корне баночки.
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)@SeverityOne: также null.
в вашей IDEA вы можете распечатать записи пути к классам с помощью System.getProperty("java.class.path"), и для каждой записи выйдите на терминал и посмотрите, содержит ли он файл application.properties в корне этих записей.
@JigarJoshi: Я добавил это к вопросу. Да, application.properties есть.
@popeno Вы запускали приложение из кода модуля? Если не пробовали?




Я нашел решение, хотя я не совсем понимаю, почему это работает, а проблемная строка - нет, но это работает:
Application.class.getResourceAsStream("/application.properties")
где Application - это просто класс в моем приложении.
Возможно, это связано с ответом, на который указывает очи, и Application.class использует загрузчик классов мой, а appProperties.getClass() использует загрузчик системных классов. Но почему он по-разному ведет себя по-разному на Java 8 против 10, не очевидно.
Да, похоже, это та же проблема ... все же странно, тем не менее
Просто вызовите getClass из любого нестатического метода.
@AbhijitSarkar: мне нужно значение в статическом методе.
Затем используйте имя класса.
@AbhijitSarkar: это то, что я уже сделал и задокументировал в своем ответе здесь.
Класс этой переменной является системным и загружается другим загрузчиком классов.
Вы должны использовать один из ваших классов собственный.
Верно. appProperties.getClass().getResourceAsStream(...) является эквивалентом Properties.class.getResourceAsStream(...), поэтому он находит ресурс, связанный с java / util / Properties. Переход на Application.class.getResourceAsStream(...), чтобы ресурс был связан с классом приложения, - это правильный шаг.
Я получил ту же ошибку при использовании Intellij, и исправление состояло в том, что мне нужно было добавить формат файла конкретного ресурса, который я собираюсь получить. Перейдите CRTL + ALT + s или настройки-> компилятор-> шаблоны ресурсов: Введите расширение файла в это поле. Нажмите "Применить", затем хорошо
это поможет? stackoverflow.com/questions/16570523/…