Как использовать относительный путь вместо абсолютного - PullRequest
0 голосов
/ 28 февраля 2020

Поэтому мне нужно установить значок для плагина Intellij IDEA, но когда я пытаюсь получить этот значок из моего проекта с помощью new File(relative path) или getClass().getResource(relative path). Он не может найти файлы, работает только с абсолютным путем. Я пробовал со следующими относительными путями:

  1. images/icon.png
  2. resources/images/icon.png
  3. main/resources/images/icon.png
  4. src/main/resources/images/icon.png

Путь к значкам: src/main/resources/images/icon.png

Путь к исходному коду: src/main/java/com/timetrack/plugin/MyClass.java

код:

File file = new File("src/main/resources/images/running.png");
BufferedImage img = ImageIO.read(file);

или с этим

BufferedImage img = ImageIO.read(getClass().getResource("images/running.png"));

РЕДАКТИРОВАТЬ

Необходимо отметить, что я использую Gradle для создания проекта. Таким образом, выходной каталог выглядит следующим образом:

Путь к значку : build/resources/main/images/icon.png

Скомпилированные классы : build/classes/java/main/com/timetrack/plugin/MyClass.class

1 Ответ

0 голосов
/ 29 февраля 2020

Строка ресурса должна начинаться с 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").

...