Как правильно использовать относительные пути?

Когда я создаю File и как аргумент указываю "src/tetris/YellowBrick.png", где src - папка, находящаяся в папке проекта и запускаю программу через NetBeans, то абсолютный путь определяется корректно (D:\Codes\Tetris\src\tetris\BlueBrick.png), но если я запущу непосредственно jar файл, то путь будет определяться как C:\Users\user\src\tetris\BlueBrick.png. Пожалуйста, подскажите как это можно решить.


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Когда используется доступ к файлу и путь к файлу относительный (т.е. начинается не с /), то файл ищется относительно текущей рабочей директории процесса, в котором такой вызов происходит.

В этих двух описанных случаях программы запускаются из разных директорий, путь к файлу указан для одного из случаев (т.е. он "правильный" только тогда, когда запуск идет из IDE) и в другом, ожидаемо, не находится.

Судя по названию файла, это не параметр, который пользователь может изменить, а ресурс, который приготовил программист заранее и программа его использует в работе. В таком случае правильным решением будет настроить сборку проекта таким образом, чтоб файл ресурса попадал в classpath и изменить программу, чтобы она его загружала из classpath, а не из файла.

В случае запуска из IDE, это означает, что нужно либо добавить папку с ресурсами в classpath, либо настроить проект, чтоб файлы ресурсов копировались в директорию выходных файлов.

В случае jar файла, нужно настроить сборку таким образом, чтоб ресурс копировался в jar файл. Если вы собираете jar файл из IDE, то настройки для копирования ресурсов обычно добавляют файлы ресурсов и в jar.

Но лучше всего использовать для сборки maven/gradle и структуру проекта maven. IDE умеют с ней работать без дополнительных настроек и там предусмотрена специальная папка для ресурсов.

Загрузку файла из classpath нужно делать используя getClass().getClassLoader().getResourceAsStream, смотрите подробности, например, тут

→ Ссылка