Получение списка установленных пакетов OSGI во время выполнения

Мое приложение получает имена классов из файла свойств. Классы, представленные этими именами классов, могут находиться в определенных пакетах OSGI, неизвестных заранее, поэтому, чтобы создать их экземпляры, я сначала должен найти, к какому пакету принадлежат эти классы. Я думаю о получении всех установленных пакетов из BundleContext # getBundles, это означает, что я должен получить ссылку на BundleContext в AbstractUIPlugin # start. Но я не уверен, что удержание ссылки на BundleContext - это правильная вещь, поскольку она должна использоваться только в методе start. Поэтому мне нужен совет экспертов OSGI об альтернативах для получения списка пакетов.

Любая помощь будет принята с благодарностью.

С Уважением,

Setya

3 ответа

Это не совсем то, как OSGi предназначен. Если пакету есть что добавить в "глобальный" контекст, вы должны зарегистрировать сервис. Таким образом, каждый пакет, которому есть что поделиться, может сделать это в своем собственном методе запуска.

Какой-то другой компонент (DS, ServiceTracker, Blueprint, что-то в этом роде) может затем прослушивать эти события и действовать соответственно.

Это действительно важно, если вы начнете поиск вручную по всем пакетам, вы полностью потеряете преимущества OSGi.

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

Маршрут, по которому вы планируете пойти (свойства, которые называют классы), является злым, поскольку вы, несомненно, попадете в ад загрузки классов. Модульность заключается в том, чтобы скрыть детали реализации, названия классов реализации - именно такие детали.

Экспонирование классов реализации в файлах свойств - это действительно плохая практика, и оно теряет преимущество модульности. Не имеет значения, относится ли другой класс к вашему классу реализации или файлу свойств, проблема в том, что impl. класс разоблачен.

К сожалению, эта модель стала настолько распространенной в нашей отрасли, что многие разработчики считают ее нормальной:-(

OSGi позволяет вам совместно использовать экземпляры, типизированные интерфейсами, таким образом, чтобы класс реализации был известен только внутри модуля.

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

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

Если это невозможно, вы можете использовать контекст комплекта для получения запущенных комплектов и создания экземпляров классов, но OSGi не должна работать. Вы столкнетесь с проблемами загрузки классов, поскольку пакет, который пытается создать экземпляр класса, не будет иметь прямого доступа к ним.

Другие вопросы по тегам