Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347

Упаковка ресурса в артефакт и получение пути

12.11.2020, 01:57. Показов 6149. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток вам.

Сразу надо сказать, что работаю в Intellij IDEA.
Есть такая ситуация: одна либа требует файла конфигурации для корректной работы. Пока все происходит в ИДЕИ и пути абсолютны - я могу просто прокидывать абсолютный путь как строку в метод конфигурации, и все будет работать.
Когда же речь идет о запаковке в артефакт, то все меняется: абсолютного пути уже не существует. Вопрос: что же делать, как получить относительный путь?

В интернете нашел много (бес)полезных советов, проблема которых в их "неполности":
  • Кто-то просто советует объявить папку, где лежит файл, как папку ресурсов. Но при этом не указывает, как же читать оттуда.
  • Кто-то советует читать методом Class.getResource(), но не указывает, где же лежит этот класс и какой же будет относительный путь.
  • Кто-то говорит о чтении class.getResourceAsStream() - но тут вообще непонятно: на выходе получаю не путь, а сам файл.

В общем, инструменты, которыми надо орудовать, мне понятны. Мне непонятно, что с ними делать.
Если задача: "получить путь", исходные данные - мы знаем, в каком классе работаем (типа знаем путь до класса от корня проекта) и знаем относительный путь до ресурса (а вот тут не уверен, смотри ниже).

Отдельной проблемой идет то, что в распакованном виде:
  • файл лежит по пути /src/main/resources/{файл}
  • код лежит в /src/main/java/{пошли пакеты}
А в запакованном виде:
  • файл лежит по пути /{файл}
  • код лежит в /{пошли пакеты}
То есть сразу в корне лежат и пакеты с классами, и файл - относительные пути изменились.

Вот и как быть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2020, 01:57
Ответы с готовыми решениями:

Получение ресурса string в классах
Доброе утро товарищи. Понадобилось получение строк из классов не содержащих context или activity. Погуглив узнал, что есть 2...

Получение Utilization отдельного ресурса (Unit) конкретного ResourcePool
Добрый день! Подскажите, пожалуйста, как вытащить утилизацию отдельного ресурса блока ResourcePool?

Получение Модели DOM (Web ресурса), загруженной JAVA приложением на компе
Всем здравствуйте! Описание проблемы: Есть информационная система работа с которой осуществляется через браузер(IE). Я не являюсь...

13
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.11.2020, 10:04
В готовом артефакте надо получить стрим, а не путь. Если либа поддерживает такой вариант, надо использовать его.
Если нужна именно строка, то конфигурацию надо положить в папку рядом с артефактом и читать оттуда.

Можно закостылить метод распаковки артефакта, доставание оттуда файла с последующим чтением, но это на самый крайняк и луче так не делать
1
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
12.11.2020, 13:48  [ТС]
KEKCoGEN, то есть именно получать путь нельзя? Это просто отвратительно. Я был лучшего мнения о яве.

Либо простая: log4j. И чтобы она работала, ей нужен - log4j.properties
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
12.11.2020, 13:53
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
то есть именно получать путь нельзя? Это просто отвратительно. Я был лучшего мнения о яве.
ты же не понял, что тебе написали, так?
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Либо простая: log4j. И чтобы она работала, ей нужен - log4j.properties
и что у тебя мозгов не хватает конфиг для либы положить?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
12.11.2020, 13:55  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
В готовом артефакте надо получить стрим, а не путь. Если либа поддерживает такой вариант, надо использовать его.
Если я правильно понял, то есть возможность грузить файл конфига, как стрим.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Properties props = new Properties();
InputStream is = getClass().getResourceAsStream("/log4j.properties");
try {
    props.load(is);
}
finally {
    try {
        is.close();
    }
    catch (Exception e) {
        // ignore this exception
    }
}
PropertyConfigurator.configure(props);
Однако это не объясняет, как я получу этот файл. То есть все еще стоит проблема чтения - откуда мне его читать, если
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Отдельной проблемой идет то, что в распакованном виде:
файл лежит по пути /src/main/resources/{файл}
код лежит в /src/main/java/{пошли пакеты}
А в запакованном виде:
файл лежит по пути /{файл}
код лежит в /{пошли пакеты}
0
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,427
Записей в блоге: 2
12.11.2020, 14:05
Лучший ответ Сообщение было отмечено Vhodnoylogin как решение

Решение

Vhodnoylogin, log4j сам по идее грузит конфиги из корня jar файла, главное туда его положить, еще можно положить где угодно настройки вне jar и передать путь в спец параметре при запуске программы
а в самой программе ничего не надо делать, конфиги сами загрузятся
1
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
12.11.2020, 14:09  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
ты же не понял, что тебе написали, так?
вряд ли понял ты, что ты написал.
Ибо я говорил, что было бы прекрасно получать внутренние пути в артефакте и работать с ними, будто бы архива не существует. Но так нельзя.

Цитата Сообщение от xoraxax Посмотреть сообщение
и что у тебя мозгов не хватает конфиг для либы положить?
Цитата Сообщение от xoraxax Посмотреть сообщение
конфиг для либы положить?
Цитата Сообщение от xoraxax Посмотреть сообщение
положить
куда положить? На стол? Под стол?
Весь вопрос вокруг этого и вертится: как получить файл, который лежит в артефакте. И есть вытекающий из него вопрос: как получить файл, если путь до него меняется, когда он упаковывается в артефакт.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.11.2020, 14:39
Vhodnoylogin, log4j по дефолту берет файл из класспаса (тот что в джаре). Для этого ничего недлать не надо. Если нужно подключить внешний файл (например разная конфигурация для разных стендов), это делается через специальный аргумент окружения. Мануалов на эту тему миллион есть.
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
12.11.2020, 17:19  [ТС]
KEKCoGEN, изначально мне было интересно, как работать с путями внутри артефакта. Особенно, если они изменяются при упаковке проекта.
И на этот вопрос ответа не получил: так и не понял, как можно обратиться к файлу, если я не знаю, где он лежит.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.11.2020, 17:12
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
изначально мне было интересно, как работать с путями внутри артефакта.
если есть любой файл конфигурации, то сначала проверяют пришла ли конфигурация извне (переменная окружения) и если пришла - читают файл стрим из неё.
Если не пришла, берут стрим из внутреннего файла на класспасе.
Таким образом ничего никогда не изменяется.
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
25.11.2020, 02:04  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
log4j сам по идее грузит конфиги из корня jar файла
А вот тут меня ждало разочарование. Файл лежит в корне джарника, я проверял. Но он не подтягивается автоматом.

Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
изначально мне было интересно, как работать с путями внутри артефакта. Особенно, если они изменяются при упаковке проекта.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
если есть любой файл конфигурации, то сначала проверяют
Я совершенно не об этом. А о том, что не понимаю как работать с ЛЮБЫМ файловым ресурсом внутри джарника, если у него изменяется путь во время "распаковки"/"запаковки".
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.11.2020, 10:04
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
А о том, что не понимаю как работать с ЛЮБЫМ файловым ресурсом внутри джарника
почему бы не прочитать предыдущий ответ?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
25.11.2020, 17:35  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
почему бы не прочитать предыдущий ответ?
Этот ответ мне ни о чем не говорит.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
25.11.2020, 17:46
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Этот ответ мне ни о чем не говорит.
ну нет, так нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2020, 17:46
Помогаю со студенческими работами здесь

Стратегия "получение ресурса есть инициализация"
Здорова! Тут вообщем новую концепцию ООП вычитал "получение ресурса есть инициализация" Вообщем считается когда используешь...

Получение пути сохранения файла
Приветствую. Хочу на странице сайта нажимать кнопку, после чего должен появиться какой нить диалог для выбора каталога на локальном ПК. В...

GetOpenFileName получение относительного пути
Использую такой код: OPENFILENAME ofn; wchar_t szFile; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ...

Получение пути к файлу из ODBC
Есть маленькая проблема, я не знаю как вытянуть с ODBC путь к БД (файлу). Это наверно какое-то свойство Database?

Получение пути к пользовательской директории
Злосчастная GetUserDirectory, которую нашел в мсдне, работает лишь под C#. Начал искать дальше, нашел вот такие кренделя: GetFolderPath -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru