Я пробовал ваше приложение с обоими openjdk 8 и 11 на MacOS, и оно не работает с обоими.Я думаю, вам нужно взглянуть на [1] и [2], чтобы понять, как работает getResourceAsStream
.
TLDR:
Если путь абсолютный (т. Е. Начинается с косой черты - /
), то class.getResourceAsStream()
выполняет поиск по указанному пути
Если путь НЕ абсолютен (то есть не начинается с косой черты), то class.getResourceAsStream()
выполняет поиск в построенном пути, соответствующем имени пакета, где точки заменяются косыми чертами
Итак, работает ли он или нет, зависит от 2 вещей:
- Является ли ваш путь абсолютным или нет?
- Находится ли
file
в той же упаковке, что и класс, или нет?
По сути, в вашем примере, как указано, он не может работать, если путь не является абсолютным, потому что Class.class.getResourceAsStream()
всегда будет разрешать путь к java/lang/<file>
, поэтому ваш файл должен находиться в системе.пакет.Поэтому вместо этого вы должны использовать <MyClass>.class.getResourceAsStream()
или альтернативно использовать абсолютный путь
[1] https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)
[2] https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource%28java.lang.String%29
Обновление
Начиная с Java SE 9, вызывая getResourceXXX для класса в именованном модуле, только найдет ресурс в этом модуле, он не будет искать путь к классу, как это было в предыдущем выпуске.Поэтому, когда вы используете Class.class.getResourceAsStream()
, он попытается найти ресурс в модуле, содержащем java.lang.Class
, который является java.base
модулем.Очевидно, ваш ресурс не находится в этом модуле, поэтому он возвращает ноль.
Вы должны сделать java 9+ для поиска файла в вашем модуле, который, скорее всего, является "неназванным модулем".Вы можете сделать это, изменив Class
на любой класс, определенный в вашем модуле, чтобы заставить java использовать правильный загрузчик классов.