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

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

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

Доброго времени суток вам.

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

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

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

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

Вот и как быть?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2020, 01:57
Ответы с готовыми решениями:

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

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

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

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

13
Эксперт Java
2359 / 2189 / 558
Регистрация: 28.12.2010
Сообщений: 8,566
12.11.2020, 10:04 2
В готовом артефакте надо получить стрим, а не путь. Если либа поддерживает такой вариант, надо использовать его.
Если нужна именно строка, то конфигурацию надо положить в папку рядом с артефактом и читать оттуда.

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

Либо простая: log4j. И чтобы она работала, ей нужен - log4j.properties
0
2888 / 2464 / 761
Регистрация: 05.07.2013
Сообщений: 11,923
12.11.2020, 13:53 4
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
то есть именно получать путь нельзя? Это просто отвратительно. Я был лучшего мнения о яве.
ты же не понял, что тебе написали, так?
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Либо простая: log4j. И чтобы она работала, ей нужен - log4j.properties
и что у тебя мозгов не хватает конфиг для либы положить?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
12.11.2020, 13:55  [ТС] 5
Цитата Сообщение от 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
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,449
12.11.2020, 14:05 6
Лучший ответ Сообщение было отмечено Vhodnoylogin как решение

Решение

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

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

Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
изначально мне было интересно, как работать с путями внутри артефакта. Особенно, если они изменяются при упаковке проекта.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
если есть любой файл конфигурации, то сначала проверяют
Я совершенно не об этом. А о том, что не понимаю как работать с ЛЮБЫМ файловым ресурсом внутри джарника, если у него изменяется путь во время "распаковки"/"запаковки".
0
Эксперт Java
2359 / 2189 / 558
Регистрация: 28.12.2010
Сообщений: 8,566
25.11.2020, 10:04 12
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
А о том, что не понимаю как работать с ЛЮБЫМ файловым ресурсом внутри джарника
почему бы не прочитать предыдущий ответ?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
25.11.2020, 17:35  [ТС] 13
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
почему бы не прочитать предыдущий ответ?
Этот ответ мне ни о чем не говорит.
0
Эксперт Java
2359 / 2189 / 558
Регистрация: 28.12.2010
Сообщений: 8,566
25.11.2020, 17:46 14
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Этот ответ мне ни о чем не говорит.
ну нет, так нет
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2020, 17:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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

Получение пути к файлу в sShellListView
Есть ли какая-нибудь функция (или параметр) sShellListView для получения пути к выбранному файлу,...

Получение пути монтирования по FILE_OBJECT
Описание: Есть существующий FILE_OBJECT указывающий на файл, находящийся на USB флешке. Необходимо...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.