OSGi: программно добавить импорт в пакет - PullRequest
1 голос
/ 07 октября 2009

Как я могу добавить пакеты к импорту пакета из кода? Мне это нужно, поскольку я использую библиотеки, которые полагаются на отражение и требуют других пакетов, и мне не нужно вручную добавлять эти пакеты в MANIFEST.MF для каждого пакета, который я разрабатываю

Ответы [ 2 ]

3 голосов
/ 08 октября 2009

Вы не можете. Пакеты импорта оцениваются на этапе разрешения. (Фазы установлены -> Разрешены -> Активны).

Ваш код выполняется, когда пакет активен, поэтому слишком поздно для добавления пакетов импорта.

Вы можете сделать 2 вещи:

  • Import-Pack пакеты, которые вы собираетесь использовать
  • Используйте свойство Dynamic-ImportPackage, чтобы указать пакеты, разрешение которых можно отложить до времени выполнения
0 голосов
/ 13 октября 2009

В дополнение к решению Филиппо, вы можете попробовать инвертировать зависимость. F.I. вместо того, чтобы вызывать и проверять другие пакеты, вы можете позволить пакетам делать это. Другим способом было бы использовать трекер пакета и получить ClassLoader отслеживаемого пакета. С этим загрузчиком классов вы можете действовать как «пакет», поэтому вам больше не нужно предложение Import-Package.

Когда я начал использовать OSGi, это было одним из первых требований, которые я предложил. Со временем я понял, что почти во всех случаях существует более чистое и последовательное решение. Так что подумайте, если вам действительно нужна эта зависимость. Нет ли способа инвертировать или абстрагировать его для создания общего решения?

Если ничего не помогает (в крайнем случае), вы также можете создать (в памяти) фрагмент с базовым комплектом в качестве хоста, обеспечив необходимый импорт. BundleContext предлагает вам метод для загрузки пакета из потока. Затем вам нужно обновить и вызвать пакеты обновления (через службу PackageAdmin) в вашем хост-пакете, чтобы получить обновленный ClassLoader (подразумевает перезапуск вашего пакета). Однако в конце вы получите доступ ко всем вашим пакетам.

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

Ура, Mirko

...