По какому принципу Java-метод `getResource` ищет файлы?
В моём JavaFX приложении произошла распространённая ошибка "Caused by: java.lang.IllegalStateException: Location is not set.". Она вызвана это строкой:
FXML_Loader.setLocation(getClass().getResource("/views/RootLayout.fxml"));
Чтобы бегать каждый раз на форум при возникновении данной ошибки, нужно понять, по какому принципу метод getResource ищет файлы. Я так думаю, он преобразует параметр в абсолютный путь к файлу, а ошибка произошла потому, что этот метод либо не понял, относительно чего нужно генерировать абсолютный путь, либо сгенерировал его неправильно.
Для большей конкретики разобью свой вопрос на три подвопроса:
- Относительно чего будет сгенерирован абсолютный путь к "RootLayout.fxml"?
- Как изменить эту базовую директорию?
- Какие существуют стандартные подходы в Java для организации статических файлов и обеспечения доступа к ним? (Если ответ на этот подвопрос будет длинным, то ссылка на статью по этой теме вполне подойдёт)
Ответы (1 шт):
Вообще это довольно сложный вопрос.
В идеальном мире
getResource()ищет ресурсы вCLASSPATH, если быть точнее отправляет запрос к загрузчику классов, который собственно и ищет вCLASSPATHВ реальном мире, положение
resourceзадается билдером, например если вы подmaven, то положениеresourceможно задавать примерно так:<resources> <resource> <directory>src/fx/resources</directory> </resource> </resources>В gradle по умолчанию предполагается, что
resourceлежит в каталогеsrc/main/resourcesего также можно задавать менять самому (погуглите)Корень относительно которого ищется ресурс показывает как раз на каталог
resource, на который показывает билдер/загрузчик классов.Если корень не указан, то есть имя ресурса не начинается с
/, то ресурс ищется в каталоге состоящем из имени пакета класса - типа:my/class/package/name/