Соглашение Maven использует стандартную структуру каталогов и, если не указано иное, требует, чтобы вы следовали ему. Одна из вещей, которую делает стандартная структура каталогов, - это отделение исходных файлов Java (.java
) от файлов ресурсов (все, кроме .java
). Это выглядит так:
|--projectDir/
| |--src/
| | |--main/
| | | |--java/
| | | |--resources/
Исходные файлы заносятся в src/main/java
, а файлы ресурсов - в src/main/resources
.
При создании проекта Maven скомпилирует исходные файлы и поместит файлы .class
в projectDir/target/classes
. Он также скопирует любые файлы ресурсов из src/main/resources
в target/classes
. По умолчанию любые не исходные файлы в src/main/java
будут игнорироваться. Вы упоминаете, что поместили свой файл styles.css
в src/main/java
, и, следовательно, его нет в target/classes
при запуске проекта.
Когда вы выполняете проект, каталог target/classes
(как и любые зависимости) помещается в путь к классам. Но поскольку ваш styles.css
файл не был скопирован в target/classes
, он не включен в classpath, и вы в итоге получаете NullPointerException
s при попытке обратиться к нему.
Решение состоит в том, чтобы переместить файл styles.css
в каталог src/main/resources
. Похоже, что в настоящее время он у вас под src/main/java/rocks/zipcode/atm
. Если вы хотите сохранить файл ресурсов в том же «пакете», переместите его в src/main/resources/rocks/zipcode/atm
. Затем он должен быть скопирован в каталог target/classes
при перестройке проекта.
Тогда вы можете сослаться на это несколькими способами.
Первый способ - getClass().getResource(...)
. Если вы передадите абсолютный путь (начинается с /
), он будет искать ресурс в корне пути к классам. Если вы не пройдете абсолютный путь (не начинается с /
), он будет искать ресурс относительно местоположения Class
(в данном случае, Class
тот, который возвращается getClass()
). Это означает, что, поскольку вы получаете ресурс из rocks.zipcode.atm.CacheMachineApp
, вы можете сделать:
getClass().getResource("/rocks/zipcode/atm/styles.css")
или
getClass().getResource("styles.css")
Другой вариант - использовать поведение, определенное в документации getStylesheets()
:
Получает наблюдаемый список строковых URL-адресов, ссылающихся на таблицы стилей для использования с содержимым этой сцены.
URL-адрес представляет собой иерархический URI в форме [схема:] [// авторитет] [путь]. Если в URL нет компонента [схема:], он считается только компонентом [путь]. Любой начальный символ «/» в [пути] игнорируется, а [путь] обрабатывается как путь относительно корня пути к классу приложения.
Как вы можете видеть, когда схема отсутствует (например, file:
, https:
и т. Д.), Он будет искать ресурс относительно корня пути к классам . Поскольку он всегда относительно корня, вам необходимо пройти абсолютный путь (но в этом случае он не требует ведущего /
).
getStylesheets().add("rocks/zipcode/atm/styles.css");
Важное примечание: Убедитесь, что вы правильно указали путь . Это чувствительно к регистру, когда упаковано в файл JAR. Он может быть или не быть чувствительным к регистру, когда он не упакован в файл JAR, но это зависит от базовой файловой системы. В любом случае, лучше всего соответствовать случаю реального пути, чтобы избежать каких-либо проблем.