Чтение файла свойств в Karaf из другого пакета

Есть ли в Karaf способ чтения файла свойств из другого пакета?

У меня есть bundle1, который содержит некоторые классы, которые использует bundle2 (bundle1 экспортирует пакет, содержащий эти классы, в свой maven pom через maven-bundle-plugin и bundle2 импортирует его). Но bundle2 также должен использовать файл свойств из bundle1. Есть ли способ, которым помимо классов, bundle2 может получить доступ к файлу из bundle1?

Из того, что я прочитал, один из вариантов — развернуть свойства в папке karaf и т. д. через файл функций, а затем получить к ним доступ из bundle2 через схему. Я хотел бы избежать этого, если это возможно, так как bundle1 в настоящее время не развернут как функция. Так что надеюсь на альтернативный подход.


person J Woodchuck    schedule 14.07.2017    source источник


Ответы (1)


Самый лучший способ — обернуть доступ через класс bundle1. Предположим, что bundle1 содержит класс с именем MyClass. Внутри этого класса вы можете сделать this.getClass().getResourceAsStream(path). Путь указан относительно пакета класса.

Таким образом, метод этого класса может возвращать поток ввода для файла свойств или разрешать доступ к фактическим свойствам.

На самом деле вы также можете получить доступ к файлу свойств из bundle2. Просто используйте MyClass.getResourceAsStream(path) из класса в bundle2. Это работает, поскольку каждый класс по умолчанию загружается загрузчиком классов пакета, в котором он находится.

person Christian Schneider    schedule 14.07.2017
comment
Хм, я могу получить доступ к файлу ресурсов из пакета, в котором он находится (bundle1), используя ваше предложение (вроде... т.е. мне пришлось изменить его на ...getClass().getClassLoader()...). Однако доступ к файлу из другого пакета (bundle2) по-прежнему возвращает для меня значение null. - person J Woodchuck; 15.07.2017
comment
Вам нужно использовать класс из bundle1, чтобы получить загрузчик классов. Например, MyClass.getClass().getClassLoader(), где мой класс находится в пакете1. Вы можете сделать это из любого класса в любом пакете и получите загрузчик классов из пакета1. - person Christian Schneider; 15.07.2017
comment
Хорошо, я попробую это снова. Но это должно быть ...getClass().getClassLoader()..., правильно? Просто хочу уточнить, так как ваш ответ не включает часть getClassLoader(). - person J Woodchuck; 15.07.2017
comment
Вы можете использовать оба, но тогда путь интерпретируется по-разному. getClass().getClassLoader().getResourceAsStream использует абсолютный путь в загрузчике классов, в то время как getClass().getResourceAsStream() относится к пакету, если ваш класс. - person Christian Schneider; 15.07.2017
comment
Ах, большое спасибо! Это действительно помогает прояснить. Что также помогло, так это то, что я переместил свой файл ресурсов в src/main/resources. Я случайно нашел его в src/main/java, и он не работал. Работает сейчас! - person J Woodchuck; 16.07.2017