Как прочитать файл свойств в папке ресурсов модуля buildSrc?

Мне нужно прочитать файл свойств, расположенный внутри папки ресурсов специального модуля buildSrc, чтобы создать объект kotlin, который будет доступен другим модулям проекта. Я пытался поставить этот файл свойств

  1. в корневой папке проекта (этот случай иногда работает иногда нет, поэтому ищу более надежный случай)
  2. внутри папки buildSrc напрямую
  3. и теперь попробуйте поместить в папку обычных ресурсов внутри buildSrc, которая даже выделена ide как распознанная папка ресурсов

Но при сборке модулей получаю Exception file not found на строке load()

Итак 2 вопроса:

  1. где должен находиться файл свойств
  2. как прочитать его из kotlin внутри модуля buildSrc.

структура проекта dependencies.kt


person curioushikhov    schedule 11.09.2020    source источник


Ответы (2)


Попробовав разные варианты, я нашел 100% стабильный и рабочий вариант — вместо того, чтобы читать файл свойств, анализировать его и проверять ввод — просто используйте объекты kotlin как готовую к использованию конфигурацию! При таком подходе исчезла проблема текущей папки и доступности ресурсов, что мне и было нужно. Свойство в kt-файлах

person curioushikhov    schedule 14.09.2020

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

Во-первых, методы getResource и getResourceAsStream присутствуют как в Class, так и в ClassLoader, и ведут себя они по-разному.

В классе, если вы не ставите перед ним косую черту, он будет искать ресурсы относительно пакета класса. С косой чертой он смотрит на корень иерархии. Поскольку вы не знаете пакет скомпилированного скрипта, сделанный Gradle, правильный способ ссылки на файл — javaClass.getResourceAsStream("/file.properties") (обратите внимание на косую черту).

Если вместо этого вы используете методы из ClassLoader, косая черта в начале не имеет смысла. Так что здесь Thread.currentThread().contextClassLoader.getResource("file.properties")) правильно.

Последнее, что нужно учитывать, это когда вы можете использовать методы из класса и когда вам нужно использовать ClassLoader. Насколько я могу судить, вы можете использовать метод класса в том же проекте (или плагине). Так что это должно работать изнутри buildSrc. Но если вы хотите получить ресурс вне buildSrc, я считаю, что вам нужно пройти через контекстный загрузчик классов.

person Bjørn Vester    schedule 11.09.2020
comment
После некоторого мозгового штурма я обнаружил, что использование файлов kotlin вместо файлов свойств намного чище, и это решает проблему загрузки внешнего ресурса, устраняя необходимость в нем :) - person curioushikhov; 14.09.2020