Строка ресурса должна начинаться с sla sh, поскольку она не входит в тот же пакет, что и ваш класс.
Перефразировано из документации getResource :
- Если имя начинается с
/
, то абсолютное имя ресурса - это часть имени, следующая за /
. - В противном случае абсолютное имя имеет вид имя_пакета_измененного_пакета / имя , где имя_пакета_пакета_данных - это имя пакета этого класса, в котором
/
заменено .
.
Другими словами, предполагается, что аргумент, передаваемый в Class.getResource, находится в том же пакете, что и сам класс, если аргумент не начинается с sla sh.
Это потому что правильный способ включить ресурсы в приложение или библиотеку - поместить их в тот же каталог пакета, что и класс, который их использует. Причиной этого является та же причина, по которой мы используем пакеты. По той же причине приложения не хранят все свои файлы в домашнем каталоге пользователя или в C:\
: потому что существует реальный риск того, что другие программы выберут то же имя и будут мешать вашей программе.
Class.getResource ищет путь к классу для запрошенного ресурса. Если вы упакуете свой значок как images/running.png
, а библиотека также решит упаковать свое изображение как images/running.png
, то Class.getResource будет искать путь к классам и возвращать все, что найдет первым. В зависимости от порядка записей пути к классам, вы получите неправильное изображение или другую библиотеку. Эти два по существу наступают друг на друга.
С другой стороны, если вы поместите свое изображение в src/main/resources/com/timetrack/plugin/running.png
, маловероятно, что какой-либо другой код будет использовать этот пакет, поэтому ваши шансы на столкновение минимальны. И поскольку это был наиболее распространенный вариант использования, использовать его проще: вы можете получить URL-адрес изображения, набрав MyClass.class.getResource("running.png")
.